Скачать MetaTrader 5

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

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

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

При тестировании нашел недоработку, мой скрипт считает или 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 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);
}

//+------------------------------------------------------------------+
Ahmad Mehdiyev
478
Ahmad Mehdiyev  

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

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

Kilnart
260
Kilnart  
это да, но как то хотелось в одну функцию все засунуть, поэтому и ломал голову.
Ahmad Mehdiyev
478
Ahmad Mehdiyev  
//+------------------------------------------------------------------+
//|                                                 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);
}

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

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

Ну это можно конечно, но зачем? код и так короткий, действие будет проводиться в любом случае, что экономим? Лишнюю строчку?
Kilnart
260
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);
}

//+------------------------------------------------------------------+
Ahmad Mehdiyev
478
Ahmad Mehdiyev  
kilnart:


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


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

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

         if (OrderSymbol() == Symbol()
         {
            if(OrderType() == OP_BUY)
            {
Ahmad Mehdiyev
478
Ahmad Mehdiyev  

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

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

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

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

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

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