Будет последовательно открыто 4 ордера. Нужно сделать так, чтобы при общей (суммарной) прибыли со всех ордеров в +10 они мгновено закрывались
            
              - Полезные функции от KimIV
- Помогите найти.Закрытие ордеров по общей прибыли.
- Альтернатива TP
//+------------------------------------------------------------------+
//|                                                CloseByProfit.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright (c) 2007 - ., Gavrilin Alexander V. http://sovetnikov.net/"
#property link      "http://sovetnikov.net"
#property version   "1.00"
#property strict
#include "sovetnikov_v2.mqh"
input int Magic=0;
input double Profit=1;
//профит в пунктах
class CMain: public GOrders
  {
public:
                     CMain(){};
                    ~CMain(){};
  };
CMain main();
string sSymbols[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   main.init(_Symbol,Magic,0);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(!work_check()) return;
   int all=main.Update();
      
   if(all>0)
     {
      double p=main.p;
      int idir=0;
      double avg=main.get_Average(ALL,idir);
      
      if(idir==1 && avg>0 && ND1((Bid-avg)/p)>=Profit) main.OrderCloseAll(ALL);
      else if(idir==-1 && avg>0 && ND1((avg-Ask)/p)>=Profit) main.OrderCloseAll(ALL);
     }
   
  }
самое главное тут подсчет точки безубытка, от которой и осуществляется проверка сколько пунктов уже прошли
double GOrders::get_Average(int itype,int &idirect) { double dprice[2]={0,0}, m_lots[2]={0,0}, icount[2]={0,0}; idirect=0; double dask=MarketInfo(sname,MODE_ASK); double dbid=MarketInfo(sname,MODE_BID); int flag; if(ArraySize(ordersinfo)==0) Update(); for(int i=ArraySize(ordersinfo)-1;i>=0;i--) { // if(!OrderSelect(i,SELECT_BY_POS)) continue; if(ordersinfo[i].OrderTicket==0) continue; if((ordersinfo[i].OrderSymbol==sname || sname==NULL) && (ordersinfo[i].OrderMagicNumber==imagic || imagic==-1)) { flag=toMyTypes(ordersinfo[i].OrderType)&itype; if(ordersinfo[i].OrderType==OP_BUY && toDefType(flag,itype)==OP_BUY) { m_lots[0]+=ordersinfo[i].OrderLots; dprice[0]+=NormalizeDouble(ordersinfo[i].OrderProfit+ordersinfo[i].OrderCommission+ordersinfo[i].OrderSwap,2); icount[0]++; } if(ordersinfo[i].OrderType==OP_SELL && toDefType(flag,itype)==OP_SELL) { m_lots[1]+=ordersinfo[i].OrderLots; dprice[1]+=NormalizeDouble(ordersinfo[i].OrderProfit+ordersinfo[i].OrderCommission+ordersinfo[i].OrderSwap,2); icount[1]++; } } } if(NormalizeDouble(m_lots[0],2)-NormalizeDouble(m_lots[1],2)==0.0) return (0); if(NormalizeDouble(m_lots[0],2)>NormalizeDouble(m_lots[1],2)) idirect=1; if(NormalizeDouble(m_lots[0],2)<NormalizeDouble(m_lots[1],2)) idirect=-1; double PriceLevel=0; double TickValue=NormalizeDouble(MarketInfo(sname,MODE_TICKVALUE),2); if(TickValue==0.0) return 0; double point=MarketInfo(sname,MODE_POINT); if(point==0.0) return 0; int idigits=(int)MarketInfo(sname,MODE_DIGITS); if(MarketInfo(sname,MODE_DIGITS)==5 || MarketInfo(sname,MODE_DIGITS)==3 || MarketInfo(sname,MODE_PROFITCALCMODE)==1) idigits=(int)(MarketInfo(sname,MODE_DIGITS)-1); if((m_lots[0]-m_lots[1])>0) PriceLevel=dask-((dprice[0]+dprice[1])/(TickValue*(m_lots[0]-m_lots[1]))*point); if((m_lots[1]-m_lots[0])>0) PriceLevel=dbid+((dprice[0]+dprice[1])/(TickValue*(m_lots[1]-m_lots[0]))*point); return (NormalizeDouble(PriceLevel,idigits)); }
код как есть понятное дело не заработает, но урок извлечете.
Alexandr Gavrilin:
 
самое главное тут подсчет точки безубытка, от которой и осуществляется проверка сколько пунктов уже прошли
код как есть понятное дело не заработает, но урок извлечете.
:-) Александр ,  сразу в ООП направили, да Вы просто изверг :-)
поддерживаю , рабочие коды - это во фриланс.
Как урок - вполне отличный пример.
 
    Вы упускаете торговые возможности:
        - Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
          Регистрация
          Вход
        
        Вы принимаете политику сайта и условия использования
    Если у вас нет учетной записи, зарегистрируйтесь