Скачать MetaTrader 5

Помогите доработать скрипт - страница 2

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Alekseu Fedotov
999
Alekseu Fedotov  
kilnart:

к сожалению не правильное решение, такой вариант у меня тоже был.

дело в том, что к функции обращаемся из цикла, и значения lot и price при каждой итерации обнуляются.

если убрать обнуление, тогда при прогоне по Buy, и в случае если есть Sell, то Buy позиции прибавляются к Sell`овым.

//+------------------------------------------------------------------+
//|                                                 AveragePrice.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

double lotBuy, lotSell, priceBuy, priceSell;
double avgpriceBuy, avgpriceSell;       
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   ObjectsDeleteAll();
      
   for (int i = OrdersTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderType() == OP_BUY)
         {
            lotBuy   += OrderLots();
            priceBuy += OrderOpenPrice() * OrderLots()
         }
         if (OrderSymbol() == Symbol() && OrderType() == OP_SELL)
         {
            lotSell   += OrderLots();
            priceSell += OrderOpenPrice() * OrderLots();           
         }
      }
   }
   avgpriceBuy=0;
   avgpriceSell=0;

   if(lotBuy !=0)   avgpriceBuy = priceBuy / lotBuy;
   if(lotSell !=0)  avgpriceSell = priceSell / lotSell;

   CreatObject(avgpriceBuy);
   CreatObject(avgpriceSell);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

void CreatObject(double price)
{
   string name = "AveragePrice ";

   name = name + DoubleToStr(price,Digits);
   
   ObjectCreate(name,OBJ_HLINE,0,0,price);
   ObjectSet(name,OBJPROP_STYLE,STYLE_DOT);
}

//+------------------------------------------------------------------+
Как-то так
Ahmad Mehdiyev
478
Ahmad Mehdiyev  
Верно. Первый вариант, т.е. делать расчет внутри цикла для каждого типа ордеров - наиболее правильный. Второй вариант удалю чтобы никого не путать.
И еще не забудьте проверку на деление на 0, и нормализацию средних значений.
Kilnart
260
Kilnart  

спасибо ребят. оставлю первый вариант, и буду наращивать свои знания в программировании

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