Почему мой советник не переводит мою позицию в безубыток?

Я пытаюсь изменить свои рыночные ордера, чтобы безубыточная позиция, когда позиция становится на 100 пипсов выше. Это также объясняет StopLevels, которые составляют около 20-30 пунктов для моего брокера. Он проверяет параметры с помощью функции «for(){...} loop».

MagicNumber – это номер таймфрейма графика, на котором он находится (т. е. 240=4H, 60=1H). Я не устанавливаю цену TakeProfit и изначально нет StopLoss цена.

EA не добавляет SL к цене открытия, когда сделка достигает 100 пунктов прибыли (плюс стоп-уровни). Очки прибыли достигают более 130 очков.

Ниже приведен мой код для заказа OP_SELL — буду признателен за любую помощь. С уважением, Тодд

/*Global Declarations*/
double   pnlPoints;
double   price, sl, tp;
double   point;
int      stopLevel;
int      breakeven;
double   newSL; 

/*Local  Declaratons*/
pnlPoints            =  0;
point                =       MarketInfo( Symbol(), MODE_POINT );
stopLevel            =  int( MarketInfo( Symbol(), MODE_STOPLEVEL )
                           + MarketInfo( Symbol(), MODE_SPREAD )
                             );
sl                   =  NormalizeDouble( OrderStopLoss(), Digits );
tp                   =  OrderTakeProfit();
breakeven            =  100;


   for( int s = OrdersTotal() - 1; s >= 0; s-- )
   {    if ( (  OrderSelect( s, SELECT_BY_POS, MODE_TRADES ) ) == true )
                price = MarketInfo( Symbol(), MODE_ASK );

        newSL     =  NormalizeDouble( OrderOpenPrice(), Digits );
        pnlPoints = ( OrderOpenPrice() - price ) / point;

        if (                          OP_SELL   == OrderType()               )
              if (                    Period()  == OrderMagicNumber()        )
                    if (              stopLevel <  ( newSL - price ) / point )
                          if (        breakeven <  pnlPoints                 )
                                if (  newSL     != sl                        )

                                      ModSell = OrderModify( OrderTicket(),
                                                             OrderOpenPrice(),
                                                             newSL,
                                                             tp,
                                                             buycolor
                                                             );
                                else if (  ModBuy == false )
                                     {     Print( "OrderModify failed with error #",
                                                   GetLastError()
                                                   );
                                     }
   }

person Community    schedule 20.04.2016    source источник


Ответы (2)


На данный момент
уточните код
и
добавьте код самоотладки/отслеживания.

После OrderModify() используйте самоотладку / ведение журнала Print( StringFormat( ... ) ) для документирования всех заданных значений, используемых в фактическом OrderModify() вызове, а также удаленного выполнения ( {на стороне сервера | StrategyTester } ), о которых сообщалось о проблемах.

Текущий код в такую ​​самодиагностику не входит и ModSell вообще не проверяется, ModBuy проверяется только при неопределенных условиях/по стечению обстоятельств при каком-то будущем посещении for(){...} путь выполнения кода к части после newSL == sl (и все вышеуказанные условия тоже случайно соблюдаются)


Затем проверьте присвоенное значение tp

Как указано выше,

/*Local  Declarations*/
...
tp                   =  OrderTakeProfit();

что вызывает обоснованное сомнение в том, что повторное использование этого ( неопределенного по своей сути значения, поскольку никто не знает, что OrderSelect() был последним, который установил указатель db.Pool, чтобы решить, из какой записи из db.Pool этот самыйOrderTakeProfit() будет случайно читать (если какая-либо запись уже присутствует в db.Pool) внутри всего for(){...} обхода db.Pool записей не будут соответствовать условиям для правильной установки цены TakeProfit в следующей серии OrderModify() вызовов.

Похоже, это основная причина или источник необработанных исключений для допустимых, совместимых с брокером значений OrderModify().

person user3666197    schedule 20.04.2016

Попробуй это:

if (newSL != sl ) {
    ModSell = OrderModify( OrderTicket(),
                           OrderOpenPrice(),
                           OrderOpenPrice(),
                           0,
                           OrderExpiration(),
                           clrRed
                          );
    if(ModBuy == false )
        Print( "OrderModify failed with error #", GetLastError());
}

Затем проверьте вкладку «Эксперт» на наличие сообщения об ошибке, если не удается установить остановку.

Кроме того, вы должны принять к сведению, что стоп-лосс сработает ТОЛЬКО в том случае, если вы находитесь на правильном таймфрейме графика; В противном случае он даже не попадет в операторы if.

person Joseph Lee    schedule 12.05.2016
comment
Спасибо за ваше предложение, я на самом деле заплатил фрилансеру, чтобы он сделал это в конце концов, так как мне стало скучно пытаться это сделать, только чтобы обнаружить, что у меня это было в режиме «Только открытые цены», эй! Это означало, что первоначальный код, который я разместил здесь, был абсолютно исправен! :-) - person ; 12.05.2016