Скачать MetaTrader 5

Проблема в подсчете ордеров

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladimir Belev
300
Vladimir Belev  

Прошу помощи в отладке

При тестировании Конструкция пропускает первый ордер:

   for(i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderType()==OP_SELL && OrderSymbol()==Symbol())
           {
            s++;
            Profit=OrderLots()*(OrderOpenPrice()-(FindLastOpen()-(StepOpenOR+RecoveryVolume)*Point))/Point*PointValue;
            ProfRecSell+=Profit;
           }
         if(OrderType()==OP_BUY && OrderSymbol()==Symbol())
           {
            b++;
            Profit=OrderLots()*((FindLastOpen()-(StepOpenOR+RecoveryVolume)*Point)-OrderOpenPrice())/Point*PointValue;
            ProfRecBuy+=Profit;
           }
        }
     }

1

 Последующие ордера учитывает.

Vladimir Karputov
Модератор
68513
Vladimir Karputov  

Пожалуйста вставляйте код и картинки правильно:

Правильно вставляем код на форуме

Форум: как вставить картинку

Vladimir Belev
300
Vladimir Belev  

Зато работает в другую сторону... 

for (int i=1; i<=OrdersTotal(); i++)
   {
   if (OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES)==true)
      {
      if (OrderType()==OP_SELL && OrderSymbol()==Symbol())
         {
         s++;
         }
      if (OrderType()==OP_BUY && OrderSymbol()==Symbol())
         {
         b++;
         }
      }
   }
Artyom Trishkin
Модератор
85953
Artyom Trishkin  
Vladimir Belev:

Зато работает в другую сторону... 

В другую сторону от нуля, иначе тоже пропустит. А i<OrdersTotal
Vladimir Belev
300
Vladimir Belev  
Artyom Trishkin:
В другую сторону от нуля, иначе тоже пропустит. А i<OrdersTotal
спасибо
Vladimir Belev
300
Vladimir Belev  
Поторопился обрадоваться - проблема сохраняется. При пересчете ордеров их сумма отлична от реального числа, при этом OrdersTotal возвращает реальное число. В проверку добавлял все типы, включая те что не открывались. Кто-нибудь сталкивался с подобным?
pako
3309
pako  
Vladimir Belev:

Прошу помощи в отладке

При тестировании Конструкция пропускает первый ордер:


 Последующие ордера учитывает.

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//+------------------------------------------------------------------+
   int PosBuy=0,PosSell=0;
   double ProfitBuy=0,ProfitSell=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY)
              {
               PosBuy++;
               ProfitBuy+=(OrderProfit()+OrderCommission()+OrderSwap());
              }
            if(OrderType()==OP_SELL)
              {
               PosSell++;
               ProfitSell+=(OrderProfit()+OrderCommission()+OrderSwap());
              }
           }
        }
     }
   Alert("PosBuy  ",PosBuy," PosSell  ",PosSell," ProfitBuy =",DoubleToString(ProfitBuy,2)," ProfitSell =",DoubleToString(ProfitSell,2));
//+------------------------------------------------------------------+
  }
//+------------------------------------------------------------------+
Vladimir Belev
300
Vladimir Belev  
pako:
спасибо. профит - не главное, про него можно забыть(кстати он там подсчитывается для цены отстоящей на N пунктов). главное что даже простейший вариант с подсчетом кол-ва ордеров - выдает неверные результаты.
Andrey Barinov
39469
Andrey Barinov  
Vladimir Belev:
спасибо. профит - не главное, про него можно забыть(кстати он там подсчитывается для цены отстоящей на N пунктов). главное что даже простейший вариант с подсчетом кол-ва ордеров - выдает неверные результаты.
У вас в цикле есть вызов других функций работающих с ордерами (FindLastOpen()), если в ней тоже есть перебор и OrderSelect() то он перетирает OrderSelect из главного цикла и могут быть конфузы. Вспомогательные функции используйте один раз ДО основного цикла, тогда все будет четко, как в примерах от pako.
Vladimir Belev
300
Vladimir Belev  
Andrey Barinov:
У вас в цикле есть вызов других функций работающих с ордерами (FindLastOpen()), если в ней тоже есть перебор и OrderSelect() то он перетирает OrderSelect из главного цикла и могут быть конфузы. Вспомогательные функции используйте один раз ДО основного цикла, тогда все будет четко, как в примерах от pako.
Спасибо! Это похоже на правду. Первые тесты показали что проблема именно в этом.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий