Помогите доработать скрипт

 

Здрасте всем. Написал скрипт который показывает среднюю цену по открытым позициям данного инструмента.

При тестировании нашел недоработку, мой скрипт считает или Buy или Sell ордера, но я не могу понять, как

объяснить ему что для Buy ордеров нужно рассчитать одну цену, для Sell ордеров, другую. Буду признателен за помощь.

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

double lot, price;
double avgprice;       
string name = "AveragePrice ";
//+------------------------------------------------------------------+
//| 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)
         {
            AveragePrice();
         }
         else
         {
            if (OrderSymbol() == Symbol() && OrderType() == OP_SELL)
            {
               AveragePrice();
            }
         }
      }
   }
   CreatObject(avgprice);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

double AveragePrice ()
{
   lot   += OrderLots();
   price += OrderOpenPrice() * OrderLots();

   avgprice = price / lot;
   
   return(avgprice);
}

//+------------------------------------------------------------------+

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

//+------------------------------------------------------------------+
 

Помните нас в школе учили: "примем число яблок в корзине за X, а число груш за Y (!)".

Не помню чтобы и те и другие были X. :))) Понимаете о чем я?

 
это да, но как то хотелось в одну функцию все засунуть, поэтому и ломал голову.
 
//+------------------------------------------------------------------+
//|                                                 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 lot, price;
double avgprice;       
string name = "AveragePrice ";
//+------------------------------------------------------------------+
//| 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()
         {
            if(OrderType() == OP_BUY)
            {
               lot   += OrderLots();
               price += OrderOpenPrice() * OrderLots();
               avgpriceBUY = price / lot;
            }
            if (OrderType() == OP_SELL)
            {
               lot   += OrderLots();
               price += OrderOpenPrice() * OrderLots();
               avgpriceSELL = price / lot;
            }
         }
      }
   }
   CreatObject(avgpriceBUY);
   CreatObject(avgpriceSELL);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

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

//+------------------------------------------------------------------+

 
kilnart:
это да, но как то хотелось в одну функцию все засунуть, поэтому и ломал голову.

Ну это можно конечно, но зачем? код и так короткий, действие будет проводиться в любом случае, что экономим? Лишнюю строчку?
 
pro_:

Ну это можно конечно, но зачем? код и так короткий, действие будет проводиться в любом случае, что экономим? Лишнюю строчку?


в таком случае, вот так будет правильней (поменял и price и lot для 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();

            avgpriceBuy = priceBuy / lotBuy;
         }
         if (OrderSymbol() == Symbol() && OrderType() == OP_SELL)
         {
            lotSell   += OrderLots();
            priceSell += OrderOpenPrice() * OrderLots();

            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);
}

//+------------------------------------------------------------------+
 
kilnart:


в таком случае, вот так будет правильней (поменял и price и lot для Buy и Sell):


Согласен. Так даже не "правильней", а "правильно". :)) Либо так, либо обнулять их надо.
 

Только вот это вот обратно менять не стоило. Или не заметили?

         if (OrderSymbol() == Symbol()
         {
            if(OrderType() == OP_BUY)
            {
 

Ну если цель в том чтобы код был как можно короче (визуально тоже) то можно вот так. Я думаю вы именно это хотели.

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

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

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

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

Причина обращения: