Скачать MetaTrader 5

Нужна помощь!!!

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Dronix
17
Dronix 2013.04.09 14:02 

Как прописать в советнике так, что бы сделка открывалась 1 раз по пересечению нулевой линии MACD ??

маюсь 3 день уже...

1

Зарание спасибо)

Sergey Sartakov
1287
Sergey Sartakov 2013.04.09 14:29  
Dronix74:

Как прописать в советнике так, что бы сделка открывалась 1 раз по пересечению нулевой линии MACD ??

маюсь 3 день уже...

Зарание спасибо)

На нулевом баре производите проверку:


double Bar1 =  iMACD(string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int applied_price, MODE_MAIN, 1 );

double Bar2 =  iMACD(string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int applied_price, MODE_MAIN, 2 );

if ( Bar2 >0 && Bar1 < 0) Sell();

if ( Bar2  < 0 && Bar1 > 0) Buy();

Что-то в таком духе.... 


Arles
55
Arles 2013.04.09 15:00  
Dronix74:

Как прописать в советнике так, что бы сделка открывалась 1 раз по пересечению нулевой линии MACD ??

Это невозможно. Любые возможные варианты такой реализации будут запаздывать. А если это пересечение будет происходить следующие баров 10 туда сюда? Причем по паре пипсов. Куда сделки открывать?
Sergey Sartakov
1287
Sergey Sartakov 2013.04.09 15:23  
Arles:
Это невозможно. Любые возможные варианты такой реализации будут запаздывать. А если это пересечение будет происходить следующие баров 10 туда сюда? Причем по паре пипсов. Куда сделки открывать?


Вот сама программа:

 

datetime dt_Previous_0 = 0;
int Start()
{
    if (Time[0] ==  dt_Previous_0 )
        return; 
    dt_Previous_0 = Time[0];
    
    if (OrdersTotal() != 0) return;
    
    double d_Bar1 =  iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1 );
    double d_Bar2 =  iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 2 );

   if ( d_Bar2   >0 && d_Bar1 < 0) Sell();
   if ( d_Bar2  < 0 && d_Bar1 > 0) Buy();

   return;
}

void Sell()
{
........
}

void Buy()
{
...........
}

Что-то в таком духе.... 

Dronix
17
Dronix 2013.04.11 15:19  

Спасибо за совет))

Но вот как сделать так, чтоб сделка открывалась одна, а не целая туча??

Сергей Исаев
994
Сергей Исаев 2013.04.11 15:22  
Dronix74:

Спасибо за совет))

Но вот как сделать так, чтоб сделка открывалась одна, а не целая туча??

Сделать проверку на наличие открытых ордеров бай и селл. 

TarasBY
1747
TarasBY 2013.04.11 15:23  
Dronix74:

Спасибо за совет))

Но вот как сделать так, чтоб сделка открывалась одна, а не целая туча??

Проверять количество открытых ордеров: для "тех, кто в танке" можно через OredersTotal().
Sergey Sartakov
1287
Sergey Sartakov 2013.04.12 00:27  
Dronix74:

Спасибо за совет))

Но вот как сделать так, чтоб сделка открывалась одна, а не целая туча??


Что-то не пойму я, какая куча ? Открытым будет всегда один ордер...для этого и мы и пишем:

 if (OrdersTotal() != 0) return;

Dronix
17
Dronix 2013.04.12 14:36  

Вот, наблюдается такая картина)

1

И Ваш совет опять помог)) теперь открывается 1 сделка и после ее закрытия открывается новая...

Как прописать, что бы сделка закрывалась по сигналу индикатора?

Sergey Sartakov
1287
Sergey Sartakov 2013.04.12 18:03  
Dronix74:

Вот, наблюдается такая картина)

И Ваш совет опять помог)) теперь открывается 1 сделка и после ее закрытия открывается новая...

Как прописать, что бы сделка закрывалась по сигналу индикатора?


datetime dt_Previous_0 = 0;
int Start()
{
    if (Time[0] ==  dt_Previous_0 )
        return; 
    dt_Previous_0 = Time[0];
    
    if (OrdersTotal() != 0) return;
    
    double d_Bar1 =  iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 1 );
    double d_Bar2 =  iMACD(NULL, 0, 12, 26, 9, PRICE_CLOSE, MODE_MAIN, 2 );

   if ( d_Bar2   >0 && d_Bar1 < 0){ Sell(); CloseBuy(); }
   if ( d_Bar2  < 0 && d_Bar1 > 0) { Buy(); CloseSell()

   return;
}

void Sell()
{
........
}

void Buy()
{
...........
}

void CloseBuy();
{
...
}

void CloseSell()
{
...
}
Something like this....
Vladimir Pastushak
71268
Vladimir Pastushak 2013.04.13 09:43  
more:

Something like this....


Это не совсем правильно OrdersTotal() возвращает все ордера по всем меджикам и по всем символам ....

Вам нужно изначально проверить наличие ваших ордеров через цикл

 Примерно так 

 for (i=OrdersTotal(); i>=0; i--       )
  if(OrderSelect(i,SELECT_BY_POS)==true)
  if(OrderSymbol()==Symbol()           )
  if(OrderMagicNumber()==Magic         )
  {
  n++; 
   if ( OrderType()==0 ) 
   { 
    b++; 
   }
   if ( OrderType()==1 ) 
   { 
    s++; 
   }
  }
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий