Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Продавай продукты через Маркет и отслеживай статистику продаж
Andrey303
8
Andrey303 2014.03.11 14:10 

Доброго времени суток.

Пишу советника, который торгует сразу на нескольких валютных парах.

Описание проблемы.

При попытке выставить ордер на покупку или на продажу, терминал в журнале выводит сообщение вида: 2014.03.11 17:41:29.583 '36049145': order buy 0.01 GBPUSD opening at 0.00000 sl: 1.66251 tp: 1.66321 failed [Invalid S/L or T/P].

Т.е. я пытаюсь выставить ордер по цене 0.00000, на что сервер мне отвечает, что у меня не верный СтопЛос/ТейкПрофит.

Странность заключается в том, что рыночная информация, полученная через функцию MarketInfo, и которая была использованы для расчёта СтопЛоса/ТейкПрофита (они верны), также используется и при выставлении ордера, однако на деле получается, что советник пытается выставить ордер по цене 0.00000.,

Такая картина наблюдается на всех валютных парах, на которых работает советник.

Попытки получить, какую-то дополнительную информацию делая, например, распечатку GetLastError(), ни чего не даёт, потому как терминал почему-то вообще не хочет выводить сообщения, которые я хочу инициировать.

В отладке советника в тестере, на одной валютной паре, перечисленных выше проблем не возникает.

Получение рыночной информации.

void getMarketInfo(const string symbol) {
   sAsk = MarketInfo(symbol, MODE_ASK);
   sBid = MarketInfo(symbol, MODE_BID);
   sDigits = (int)MarketInfo(symbol, MODE_DIGITS);
   sPoint = MarketInfo(symbol, MODE_POINT);
}

Выставление ордера.

void orderSend(const string symbol, int command) {   
   double price = 0.0;
   double takeProfit = 0.0;
   double stopLoss   = 0.0;
   
   getMarketInfo(symbol);
   
   if ( OP_BUY == command ) {
      price = sAsk;
      takeProfit = NormalizeDouble(sAsk + TakeProfit * sPoint, sDigits);
      stopLoss   = NormalizeDouble(sAsk - StopLoss * sPoint, sDigits);
   } else if ( OP_SELL == command ) {
      price = sBid;
      takeProfit = NormalizeDouble(sBid - TakeProfit * sPoint, sDigits);
      stopLoss   = NormalizeDouble(sBid + StopLoss * sPoint, sDigits);
   }
   
   OrderSend(symbol, command, Lot, price, SLIPPAGE, stopLoss, takeProfit, NULL, Magic, 0, clrNONE);
}

pako
3341
pako 2014.03.11 14:16  
OrderSend(symbol, command, Lot, price, SLIPPAGE, 0, 0, NULL, Magic, 0, clrNONE);
потом модифицировать
Andrey303
8
Andrey303 2014.03.11 14:23  
Спасибо, всё заработало, закрываю эту тему.
Bicus
2395
Bicus 2014.03.11 14:31  

Всё правильно.

Например, для случая продажи у вас получается вот так:

OrderSend (symbol, OP_SELL, Lot, Bid, SLIPPAGE, Bid, Bid, NULL, Magic, 0, clrNONE); 
Вообще бред сивой кобылы.
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий