Будет последовательно открыто 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+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь