Скачать MetaTrader 5

Как написать скрипт, который будет закрывать все ордера при их общей прибыльности в +10 пунктов?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Посмотри на Топ сигналов MetaTrader 5. Выбери лучший и подпишись!
pallantis
8
pallantis 2016.06.27 16:10 
Будет последовательно открыто 4 ордера. Нужно сделать так, чтобы при общей (суммарной) прибыли со всех ордеров в +10 они мгновено закрывались
Alexandr Gavrilin
31598
Alexandr Gavrilin 2016.06.28 09:24  
//+------------------------------------------------------------------+
//|                                                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));
  }

 код как есть понятное дело не заработает, но урок извлечете.

Yuriy Zaytsev
13772
Yuriy Zaytsev 2016.06.28 09:38  
Alexandr Gavrilin:

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

 код как есть понятное дело не заработает, но урок извлечете.

:-) Александр ,  сразу в ООП направили, да Вы просто изверг :-)

поддерживаю , рабочие коды - это во фриланс.

Как урок - вполне отличный пример.

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