Скачать MetaTrader 5

Помогите написать функцию где используется расчет профита по ордеру

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

Добрый вечер! Пытаюсь решить задачу (mql4->mql5):

на mql4 она бы звучала так:  если на всех однонаправленных ордерах есть в наличии нужный профит то вернуть истина, ну и закрываем сделки.

на mql5 как бы правильно сформулировать....  э...  ну: поднять последние однонаправленные действующие ордера и просчитать а есть ли на первом нужный профит, так как будто он был один.

может этот код поможет......

if(PositionSelect(_Symbol))
     {
      
      long id = PositionGetInteger(POSITION_IDENTIFIER);
      double itProfit = PositionGetDouble(POSITION_PROFIT);
      double itVol = PositionGetDouble(POSITION_VOLUME);
      //double itCommis = PositionGetDouble(POSITION_COMMISSION);
      
      HistorySelectByPosition(id);
      
      uint total = HistoryOrdersTotal();
      ulong  ticket;
      Print("Количество действующих ордеров = "+total+" itProfit="+itProfit);
     
      
      for(int i=total;i>=0;i--)
        {
         if(ticket=HistoryOrderGetTicket(i))
           {
            
            long   typ = HistoryOrderGetInteger(ticket, ORDER_TYPE);
            double initial_volume=HistoryOrderGetDouble(ticket, ORDER_VOLUME_INITIAL);

            double profit = itProfit/itVol*initial_volume;
            Print("Выбрали ордер "+i+" тип "+typ+" profit="+NormalizeDouble(profit,_Digits));
           }
        }

     }
Андрей
492
Андрей  

Долго думал получилось вот так, это правильно или есть логические ошибки ?

//+------------------------------------------------------------------+
//|                                               schitaemProfit.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   if(PositionSelect(_Symbol))
     {

      long id=PositionGetInteger(POSITION_IDENTIFIER);
      double itProfit=PositionGetDouble(POSITION_PROFIT);
      //double itVol = PositionGetDouble(POSITION_VOLUME);
      //double itCommis = PositionGetDouble(POSITION_COMMISSION);
      double itSwap=PositionGetDouble(POSITION_SWAP);

      double priseAsk = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
      double priseBid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
      double Poin     = SymbolInfoDouble(_Symbol,SYMBOL_POINT);
      int    Spread=SymbolInfoInteger(_Symbol,SYMBOL_SPREAD);//Размер спреда в пунктах

      HistorySelectByPosition(id);

      uint total=HistoryOrdersTotal();//PositionsTotal()
      ulong  ticket;
      //Print("Количество действующих ордеров = "+total+" itProfit="+itProfit);

      ENUM_ORDER_TYPE startTyp;
      bool rezVozvrata=false;
      double profit;
      bool PerviyVhod = true;
      
      
      for(int i=total;i>=0;i--)
        {
         if(ticket=HistoryOrderGetTicket(i))
           {

            ENUM_ORDER_TYPE   typ=HistoryOrderGetInteger(ticket,ORDER_TYPE);
            if(PerviyVhod==false)
              {
               //уже не первый вход в цикл 
               if(typ!=startTyp)
                 {
                  break;
                 }
              }
            double            initial_volume = HistoryOrderGetDouble(ticket, ORDER_VOLUME_INITIAL);
            double            openPrise      = HistoryOrderGetDouble(ticket, ORDER_PRICE_OPEN);

            
            if(typ==ORDER_TYPE_BUY)
              {
               profit=((priseAsk-openPrise-(Spread*Poin))*initial_volume/Poin)+itSwap;
              }

            if(typ==ORDER_TYPE_SELL)
              {
               profit=((openPrise-priseBid-(Spread*Poin))*initial_volume/Poin)+itSwap;
              }

            Print("Выбрали ордер "+i+" тип "+typ+" initial_volume="+initial_volume+" profit="+NormalizeDouble(profit,_Digits));

            startTyp=typ;
            PerviyVhod=false;
            
            if(profit>0)
              {
               rezVozvrata=true;
              }
            if(profit<0)
              {
               rezVozvrata=false;
               break;
              }

           }
        }
      Print("По результату rezVozvrata="+rezVozvrata+", profit на первом ордере="+NormalizeDouble(profit,_Digits));
     }

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