Здравствуйте, гость ( Вход | Регистрация )

41 страниц V « < 21 22 23 24 25 > »   
Ответить в эту темуОткрыть новую тему
> Нестандартная тактика, Совместить несовместимое ...
leonid553
сообщение 6.5.2007, 9:41
Сообщение #221





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



Вот код самой-самой первой - простейшей версии советника ST+ENV :

Код

//+------------------------------------------------------------------+
//|Stochastic_Env.mq4.mq4
//| leonid553 & co
//| http://www.tradersforum.net.ru/
//+------------------------------------------------------------------+
#property copyright "leonid553 & co"
#property link      "http://www.tradersforum.net.ru/"

//---- input parameters---------
extern int     Stochastic_period=14;
extern int     Env_period=25;
extern int     Env_shift=1;
extern double  Env_deviation=20;
//------------------------------
extern int     TP=30;
extern int     SL=30;
extern double  Lot=0.1;
extern int     Slippage=3;
//-------------------
int ticket;

//*********************************************************************

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
if (Env_deviation==0) Env_deviation=0.1;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
  
//----
   return(0);
  }

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {

double Stochastic_array[49];
//заполняем массив значениями Stochastic-----------------]
int    i=0;
while (i<50)
{
Stochastic_array[i]= iStochastic(NULL, 0, Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, i);
i++;
}
//------------------------------------------------------

ArraySetAsSeries(Stochastic_array,true);
// []Цепляем на стохастик конверт - Envelope :
double
En0_low=iEnvelopesOnArray(Stochastic_array,0,Env_period,0,Env_shift,Env_deviation,MODE_LOWER,0);

double
En0_up=iEnvelopesOnArray(Stochastic_array,0,Env_period,0,Env_shift,Env_deviation,MODE_UPPER,0);

double Stochastic_0=iStochastic(NULL, 0, Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 0);
double Stochastic_1=iStochastic(NULL, 0, Stochastic_period, 3,3,MODE_SMA,0,MODE_MAIN, 1);

//]===== Ищем возможность войти в рынок ]=========================================================

int Orders=OrdersTotal ();     //[color=#3333FF]получаем кол-во открытых ордеров[/color]
if (Orders==0)         //[color=#3333FF]если нет открытых ордеров[/color]
  {  
//проверяем условие на покупку-------------[/
  if   (  /*(Stochastic_1<low_lim)  &&
          (Stochastic_0>low_lim)  &&*/
          (Stochastic_1<En0_low)  &&
          (Stochastic_0>En0_low)  )
   {
  ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,Ask+TP*Point,NULL,0,0,CLR_NONE);
  if (ticket<0) { Print("Ошибка открытия ордера BUY #", GetLastError()); return (0); }              
   }


//[]--------проверяем условие на продажу
  if  ( /*(Stochastic_1>up_lim)  &&
          (Stochastic_0<up_lim)  &&  */
          (Stochastic_1>En0_up)  &&
          (Stochastic_0<En0_up))
   {      
  ticket=OrderSend(Symbol(),1,Lot,Bid,Slippage,Bid+SL*Point,Bid-TP*Point,NULL,0,0,CLR_NONE);
  if (ticket<0) { Print("Ошибка открытия ордера SELL #", GetLastError()); return (0); }              
   }
  
//------------------------------------------------------------------
  }
//************************************************************************

//----
   return(0);
  }


Попробуем вставить сюда открытие второго - локирующего ордера.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
leonid553
сообщение 6.5.2007, 10:06
Сообщение #222





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



Прошу тех, кому интересно, и кто хоть чуть разбирается в программировании, - подсказывать по ходу дела ...
Сначала, видимо, нужно задать Магик уже имеющегося ордера, - заложеннного в советнике.
ВВодим во внешние параметры

extern int MagicNumber = 294;

Затем нужно ввести этот номер в тикет
Код

//---------проверяем условие на покупку----------------------------
  if   (  (Stochastic_1<En0_low)  &&
          (Stochastic_0>En0_low)  )
   { //----- ПОКУПАЕМ------
  ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,Ask+TP*Point,NULL,MagicNum,0,Green);
  if (ticket<0) { Print("Ошибка открытия ордера BUY #", GetLastError()); return (0); }              
   }


//--------проверяем условие на продажу------------------------------
  if  (   (Stochastic_1>En0_up)  &&
          (Stochastic_0<En0_up))
   {  //-----ПРОДАЕМ  --------  
  ticket=OrderSend(Symbol(),1,Lot,Bid,Slippage,Bid+SL*Point,Bid-TP*Point,NULL,MagicNum,0,Red);
  if (ticket<0) { Print("Ошибка открытия ордера SELL #", GetLastError()); return (0); }              
   }
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
NoName
сообщение 6.5.2007, 10:49
Сообщение #223





Группа: Активный участник
Сообщений: 514
Регистрация: 1.5.2006
Из: Украина, Кременчуг
Пользователь №: 146
Спасибо сказали: 0 раз(а)



Вставлю свои две копейкиsmile.gif

Этот советник расчитан для тестера. В крайнем случае для демо, но ТОЛЬКО ДЛЯ ОДНОГО ГРАФИКА. Это потому что изначально не был предусмотрен Magic, и потому что учёт ордеров происходит очень простым способом:
Код

int Orders=OrdersTotal ();     //получаем кол-во открытых ордеров
if (Orders==0)    //если нет открытых ордеров


Если у нас будет отрыт ордер на другом графике - то на нашем OrdersTotal () вернёт значение отличное от нуля, и советник не сработатет. Так же, изначально, стратегия предусматривала наличие только одного открытого ордера.

В случае с двумя ордерами, целесообразно ввести два Magic-а, для основного ордера и для локирующего.

например:
Код

int Magic       =111;
int MagicLock =222;

А в дальнейшем по коду контролировать их конструкцией типа:
Код

for (int i=0; i<OrdersTotal(); i++) {              
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {          
          if (OrderSymbol()==Symbol()) {                          
             if (OrderMagicNumber() == Magic) {      
            
                 // сейчас обычный ордер.
                 // что-то с ним делаем ...
              
              }
             if (OrderMagicNumber() == MagicLock) {
            
                 // сейчас выбран локирующий ордер.
                 // что-то с ним делаем ...
            
              }
            
           }
        }                      
     }    


Но это в общих чертах. Для начала ноплохо было бы уточнить при каких условиях нужно открывать локирующую позицию, и при каких условиях её закрывать.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
leonid553
сообщение 6.5.2007, 10:53
Сообщение #224





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



Благодарю Андрей !
След. вводим во внешние параметры
extern int MagicNum = 294;
extern int MagicLock = 295;
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
leonid553
сообщение 6.5.2007, 11:03
Сообщение #225





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



идем дальше...
Предположим у нас уже открылась длинная позиция.
Тогда -
Код

for (int i=0; i<OrdersTotal(); i++) {              
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
               {          
           if (OrderSymbol()==Symbol()) &&      
        (OrderMagicNumber() == MagicNum)
                                     {
            if  (OrderType() == OP_BUY)
            {  if(Bid >/.... условие для лока
{      
            
                 // сейчас обычный ордер.
                 // что-то с ним делаем ...
              
              }
             if (OrderMagicNumber() == MagicLock)
            
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
leonid553
сообщение 6.5.2007, 11:26
Сообщение #226





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



C первой позицией пока ничего не предполагается делать.
Условия же для открытия лока будут такие :
Если цена пошла против первой позиции в убыток более, чем на "m" пунктов, - открываем локирующую.
И введем для этого во внешние параметры

extern int m=20;
extern int TP_lock=30;
extern int SL_lock=30;
----------------------------------------------------
Никак не соображу, как написать условие для открытия локирующей позиции.
От чего оттолкнуться.... От величины тейкпрофита?
------------------------------------------------------------------------------------
if (OrderType() == OP_BUY) // ---длинная позиция открылась----------
{
if(Bid < (OrderTakeProfit() + (m+ spread)* Point)) // - если убыток позиции превышает "m", то открываем лок SELL
{
ticket=OrderSend(Symbol(),1,Lot,Bid,Slippage, Bid+SL_lock*Point, Bid-TP_lock*Point, NULL, MagicLock, 0, Aqua); }
-----------------------------------------------------------------------------

Вроде так ....
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
NoName
сообщение 6.5.2007, 15:46
Сообщение #227





Группа: Активный участник
Сообщений: 514
Регистрация: 1.5.2006
Из: Украина, Кременчуг
Пользователь №: 146
Спасибо сказали: 0 раз(а)



Думаю, лучше будет привязаться либо к цене открытия ордера, либо к текущему профиту.

Из справки:

double OrderOpenPrice( )
Возвращает цену открытия для выбранного ордера.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

double OrderProfit( )
Возвращает значение чистой прибыли (без учёта свопов и комиссий) для выбранного ордера. Для открытых позиций это - текущая нереализованная прибыль. Для закрытых ордеров - зафиксированная прибыль.
Ордер должен быть предварительно выбран с помощью функции OrderSelect().

Мне кажется, предпочтительнее и проще использовать последний вариант.

Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
leonid553
сообщение 6.5.2007, 18:10
Сообщение #228





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



Мы уже вроде выбрали ордер с пом. OrderSelect().
Т. е. нам теперь нужно иначе написать строку

if(Bid < (OrderTakeProfit() + (m+ spread)* Point)) // - если убыток позиции превышает "m", то открываем лок SELL

Теперь здесь нужно задействовать OrderProfit( ) ?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
NoName
сообщение 6.5.2007, 18:24
Сообщение #229





Группа: Активный участник
Сообщений: 514
Регистрация: 1.5.2006
Из: Украина, Кременчуг
Пользователь №: 146
Спасибо сказали: 0 раз(а)



нет!
OrderTakeProfit() - нам не нужен. Он возвращает нам цену на которую выставлен тейк.
OrderProfit() вернёт текущий профит ордера. Его нужно сравнивать с величиной m и принимать решение.
Код

if (OrderProfit() < -m)
{
//... действия...
}


Примерно так.

P.S. Прошу прощения, не внимательно прочёл предыдущий пост.
Совершенно верно, указанную строку нужно заменить подобно той что привёл выше.

Сообщение отредактировал NoName - 6.5.2007, 18:28
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
leonid553
сообщение 6.5.2007, 19:11
Сообщение #230





Группа: Активный участник
Сообщений: 2 002
Регистрация: 14.4.2006
Из: г.Самара
Пользователь №: 28
Спасибо сказали: 11 раз(а)



Продолжаем.
Открываем локирующую позицию.
Код
------------------------------------------------------------------------------------
{
    if (OrderType() == OP_BUY) // ---длинная позиция открылась----------
  {
     if OrderProfit() < ((-1)*m)   // - если убыток позиции превышает "m", то открываем лок SELL
    {
      ticket=OrderSend(Symbol(),1,Lot,Bid,Slippage, Bid+SL_lock*Point, Bid-TP_lock*Point, NULL, MagicLock, 0, Aqua);
     }
   }
}

else //иначе - если открыта короткая позиция и убыток .......
  {



Вот теперь уже видно - проясняется ситуация.....
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

41 страниц V « < 21 22 23 24 25 > » 
Ответить в эту темуОткрыть новую тему

 



- Текстовая версия Сейчас: 24.4.2025, 4:38