Ошибка в ценах отложек

 

Значит есть код. Задача его такая. Открывается Рыночный Бай ( СЛ и ТП по 40 пунктов.). От цены открытия Бая на одинаковой дистанции должен открыться БайСтоп и СеллСтоп. Так вот, где то в ценах ошибки. Так как летят ошибки в журнале 4107 . Ткните носом, где я туплю. Вроде уже и на бумажке расписывал цены, а всё равно бок.

Всем откликнувшимся, заранее спасибо.

Код советника прикреплён

Файлы:
1234.mq4  9 kb
 
PAZITIV:

Значит есть код. Задача его такая. Открывается Рыночный Бай ( СЛ и ТП по 40 пунктов.). От цены открытия Бая на одинаковой дистанции должен открыться БайСтоп и СеллСтоп. Так вот, где то в ценах ошибки. Так как летят ошибки в журнале 4107 . Ткните носом, где я туплю. Вроде уже и на бумажке расписывал цены, а всё равно бок.

Всем откликнувшимся, заранее спасибо.

Код советника прикреплён

И такая фигня в Илане прописана:

            if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Red);
            if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Red);
            if (OrderType() == OP_BUYSTOP) OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Red);
            if (OrderType() == OP_SELLSTOP) OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Red);

Отложенные ордера удаляются OrderDelete(), а не закрываются.

И где Вы так организовывать цикл перебора ордеров учились:

  for (int i=1; i<= OrdersTotal(); i++)
    {
     if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий

Перебор организовывается от последнего к первому.

Переменная spread объявлена как init, а вычисляется:

 Spread= NormalizeDouble(Ask,Digits)-NormalizeDouble(Bid,Digits);

Нормализовывать нужно не Ask или Bid (для СТОПов)

NormalizeDouble(Ask,Digits) - New_Stop(MarketLoss)*Point

а передаваемое в торговую функцию значение:

NormalizeDouble (Ask - New_Stop(MarketLoss)*Point,Digits)

Чтобы:

        OpnBuyPrice=OrderOpenPrice();

Нужно провести процедуру выделения ордера OrderSelect().

Это что сразу бросилось в глаза. Тяжело читать чужой код в котором не "видно" типа переменной, где не упорядочена структура кода.

 
PAZITIV:

Значит есть код. Задача его такая. Открывается Рыночный Бай ( СЛ и ТП по 40 пунктов.). От цены открытия Бая на одинаковой дистанции должен открыться БайСтоп и СеллСтоп. Так вот, где то в ценах ошибки. Так как летят ошибки в журнале 4107 . Ткните носом, где я туплю. Вроде уже и на бумажке расписывал цены, а всё равно бок.

Всем откликнувшимся, заранее спасибо.

Код советника прикреплён

Не особо вникал в логику и правописание, но не увидел в прикрепленном тексте перед " // выход из старт " return(0);

Мелким шрифтом:- как-бээ..... компактнее надо писать.... плотнее, что-ли.

Кстати, Ask и Bid по определению нормализованы.

И не уверен, можно ли вызывать функцию внутри OrderSend(), сам так никогда не делал.

 
TarasBY:

И такая фигня в Илане прописана:

Отложенные ордера удаляются OrderDelete(), а не закрываются.

И где Вы так организовывать цикл перебора ордеров учились:

Перебор организовывается от последнего к первому.

Переменная spread объявлена как init, а вычисляется:

Нормализовывать нужно не Ask или Bid (для СТОПов)

а передаваемое в торговую функцию значение:

Чтобы:

Нужно провести процедуру выделения ордера OrderSelect().

Это что сразу бросилось в глаза. Тяжело читать чужой код в котором не "видно" типа переменной, где не упорядочена структура кода.

ух ) спасибо. буду крутить. но вы там не сказали, почему отложки не открываются
hhohholl:

Не особо вникал в логику и правописание, но не увидел в прикрепленном тексте перед " // выход из старт " return(0);

Мелким шрифтом:- как-бээ..... компактнее надо писать.... плотнее, что-ли.

Кстати, Ask и Bid по определению нормализованы.

И не уверен, можно ли вызывать функцию внутри OrderSend(), сам так никогда не делал.

нет. аск и бид не нормализованы.

и что вы имеете ввиду "компактнее"? просто у меня параметры ОрдерСенд записаны в столбик для наглядности

 
PAZITIV:

нет. аск и бид не нормализованы.

и что вы имеете ввиду "компактнее"? просто у меня параметры ОрдерСенд записаны в столбик для наглядности

Результаты операций с аск и бид не нормализованы, Ask и Bid по определению нормализованы.

Компактнее это значит компактнее.

Попробуйте уменьшить кол-во пробельных строк между блоками

 
PAZITIV:
ух ) спасибо. буду крутить. но вы там не сказали, почему отложки не открываются
Чтобы:
        OpnBuyPrice=OrderOpenPrice();
Нужно провести процедуру выделения ордера OrderSelect(). Вы цену отложки считаете от OpnBuyPrice, а там пусто. Пропринтуйте для интереса.

Print ("OpnBuyPrice = ", OpnBuyPrice);
 
TarasBY:
Чтобы: Нужно провести процедуру выделения ордера OrderSelect(). Вы цену отложки считаете от OpnBuyPrice, а там пусто. Пропринтуйте для интереса.



да, я понял. просто это уже стонадцатый варинат. а в каком то цена вычислялась.

вот делаю так

TotalBuy=0;
TotalBuyStop=0;
TotalSellStop=0;

for(int i=1; i<=OrdersTotal(); i++)          
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) 
        {                                       
         if (OrderSymbol()!=Symbol() || OrderMagicNumber() != Magic) continue;     
          {
               if (OrderType() == OP_BUY)
                {
                 OpnBuyPrice=OrderOpenPrice();
                 TotalBuy++;
                 }      
         
         
               if (OrderType() == OP_BUYSTOP)
                { 
                 TotalBuyStop++;
                 }
                 
               if (OrderType() == OP_SELLSTOP)
                {
                 TotalSellStop++;
                 }  
            }
        } 
          
      Comment(" ",
      "\n TotalBuy = ",TotalBuy,
      "\n TotalBuyStop = ",TotalBuyStop,
      "\n TotalSellStop = ",TotalSellStop,
      "\n OpnBuyPrice = ", OpnBuyPrice);
          
                                       
         if (TotalBuy>1) Opn_B=false;
         if (TotalBuyStop>1) Opn_BS=false;
         if (TotalSellStop>1) Opn_SS=false;

     }

в какой части бок? ато если просто исправите, то не запомню. и как сделать перебор ордеров в обратном порядке?

ЗЫ перебор взят из учебника по МКЛ

 
PAZITIV:



да, я понял. просто это уже стонадцатый варинат. а в каком то цена вычислялась.

вот делаю так

в какой части бок? ато если просто исправите, то не запомню. и как сделать перебор ордеров в обратном порядке?

ЗЫ перебор взят из учебника по МКЛ

В оригинальном коде строчка была закоментирована - теперь правильно. Цикл перебора ордеров в обратном порядке:

for (int i=OrdersTotal() - 1; i >= 0; i-)          
{
      if (!OrderSelect (i, SELECT_BY_POS)) continue;
 
TarasBY:

В оригинальном коде строчка была закоментирована - теперь правильно. Цикл перебора ордеров в обратном порядке:



спасибо. я, кстати, разобрался, почему цена открытия ордера не считалась. Потому что я, балда, поставил тип переменной int вместо double . теперь ещё пару косячков решить и будет отлично. всем, кто отписал большое спасибо
Причина обращения: