Группа "Стол заказов MQL"

Рейтинг 2090



РЕКОМЕНДУЮ



Обработка.

Здравствуйте Андрей!

В настоящее время он работает с этим кодом.

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
{
bool cl;

for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==0 && (ot==0 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
}
if(OrderType()==1 && (ot==1 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
}
}
}
}
}

void OnTick()

if(TimeCurrent()-OrderOpenTime()>=Exit)
{
CloseAll(0);
}

if(TimeCurrent()-OrderOpenTime()>=Exit)
{
CloseAll(1);
}

Но это проблема. Причина проблемы в том, что торгуются 24 валютные пары и CloseAll (); функция закрывает все заказы. На самом деле для меня важно, чтобы при открытии каждого ордера он закрывал этот открытый ордер в назначенное время и не касался других ордеров.
Напишите мне код, который работает в этом случае.
  • 0
  • Просмотров: 1479
  • 28 сентября 2021, 16:51
  • Sirojiddin
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Переделать под mt4
Следующая запись в группе  
Робот БО по схеме Tma-Rsi-Bollinger-Bands-Fractal
27 сентября 2021
29 сентября 2021

Комментарии (20)

+
0
В настоящее время он работает с этим кодом.
кто?
avatar

  34  AM2 Сообщений: 15898 - Андрей

  • 28 сентября 2021, 17:45
+
0
Торговый робот
avatar

  17  Sirojiddin Автор Сообщений: 62

  • 28 сентября 2021, 18:08
+
0
Закрывайте каждый ордер с помощью Magic number.
Напишите мне CloseAll () вот так.
avatar

  17  Sirojiddin Автор Сообщений: 62

  • 28 сентября 2021, 18:57
+
0
В вашем коде функция CloseAll() закрывает ордера именно по магику
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)

Редактирован: 28 сентября 2021, 20:54
avatar

  13  verta81 Сообщений: 357

  • 28 сентября 2021, 20:46
+
0
Вы полагаете, что Андрей помнит каждую строчку кода каждого советника каждому заказчику???
Дайте ссылку на советник или прикрепите код, конечно если хотите получить возможность помощи.
avatar

  16  ssg Сообщений: 817

  • 28 сентября 2021, 18:20
+
0
Это личное, и я не могу этого раскрыть.
avatar

  17  Sirojiddin Автор Сообщений: 62

  • 28 сентября 2021, 18:32
+
0
Ваш советник торгует сразу 24-ю парами?
Или стоит на 24-х парах?
Редактирован: 28 сентября 2021, 20:52
avatar

  13  verta81 Сообщений: 357

  • 28 сентября 2021, 20:52
+
0
Одновременно можно открывать ордер по 5-10 пар. Работает всего 24 пары.
avatar

  17  Sirojiddin Автор Сообщений: 62

  • 29 сентября 2021, 02:55
+
0
//+------------------------------------------------------------------+
//|                                                AAA+OGNSFA EA.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "AAA"
#property link      "BBB"
#property version   "1.00"
#property strict
//------------------------------------------------------------------

//-----------------------------------------------------------------
//--- Inputs
extern string Expert_settings = "====================Settings===================="; 
extern double Lots       = 0.01;    
extern double MaxLot     = 1000; 
extern double KLot       = 1; 
extern int Count         = 1000;     
extern int Exit          = 14400;
extern int StopLoss      = 50000;   
extern int TakeProfit    = 50000;     
extern double KStep      = 1;   
extern int Slip          = 100;   
extern int Magic         = 112233;   
extern string Comments        = "DDSS";
extern string IndName    = "DSS Bressert Arrows TT";
extern int EMAPeriod     =  12;
extern int StochPeriod   =  14;
extern int Shift         = 1;
double marginRequirement, maxLot, minLot, lotSize, points, commissionPoints;
double currentSpread, avgSpread, maxSpread;
int      Ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   marginRequirement = MarketInfo( Symbol(), MODE_MARGINREQUIRED ) * 0.01;
   maxLot = ( double ) MarketInfo( Symbol(), MODE_MAXLOT );  
   minLot = ( double ) MarketInfo( Symbol(), MODE_MINLOT );
   
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)
         sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)
         sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }
  
  
   r=OrderSend(NULL,type,Lot(type),NormalizeDouble(price,Digits),Slip,sl,tp,Comments,Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades(int type=-1)
  {
   int count=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type || type==-1)
               count++;
           }
        }
     }
   return(count);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModifyOrders()
  {
   double allb=0,alls=0;
   double countb=0,counts=0,tp=0,sl=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0)
              {
               allb+=OrderOpenPrice()*OrderLots();
               countb+=OrderLots();
              }

            if(OrderType()==1)
              {
               alls+=OrderOpenPrice()*OrderLots();
               counts+=OrderLots();
              }
           }
        }
     }
   if(countb>0)
      allb=NormalizeDouble(allb/countb,Digits);
   if(counts>0)
      alls=NormalizeDouble(alls/counts,Digits);

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(TakeProfit>0)
                  tp=NormalizeDouble(allb+TakeProfit*Point,Digits);
               if(StopLoss>0)
                  sl=NormalizeDouble(allb-StopLoss*Point,Digits);
               if(OrderTakeProfit()!=tp || OrderStopLoss()!=sl)
                  bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
              }
            else
               if(OrderType()==OP_SELL)
                 {
                  if(TakeProfit>0)
                     tp=NormalizeDouble(alls-TakeProfit*Point,Digits);
                  if(StopLoss>0)
                     sl=NormalizeDouble(alls+StopLoss*Point,Digits);
                  if(OrderTakeProfit()!=tp || OrderStopLoss()!=sl)
                     bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
                 }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot(int type)
  {
   double lot=Lots;
   if(CountTrades(type)>0)
      lot=NormalizeDouble(Lots*MathPow(KLot,CountTrades(type)),2);
   if(lot>MaxLot)
      lot=Lots;
   return(lot);
  }


//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   int dig=0;
   double bid=0,ask=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderType()==0 && (ot==0 || ot==-1))
           {
            RefreshRates();
            bid=MarketInfo(OrderSymbol(),MODE_BID);
            dig=(int)MarketInfo(OrderSymbol(),MODE_DIGITS);
            cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(bid,dig),33,White);
           }
         if(OrderType()==1 && (ot==1 || ot==-1))
           {
            RefreshRates();
            ask=MarketInfo(OrderSymbol(),MODE_ASK);
            dig=(int)MarketInfo(OrderSymbol(),MODE_DIGITS);
            cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(ask,dig),33,White);
           }
        }
     }
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {


    double blue1 = iCustom(NULL,0,IndName,EMAPeriod,StochPeriod,1,Shift);
    double red1  = iCustom(NULL,0,IndName,EMAPeriod,StochPeriod,2,Shift);
    double blue2 = iCustom(NULL,0,IndName,EMAPeriod,StochPeriod,1,Shift+1);
    double red2  = iCustom(NULL,0,IndName,EMAPeriod,StochPeriod,2,Shift+1);
   
   if(CountTrades()<Count)
     {
     
     {

   if((CountTrades(0)<1 && red2>0 && blue1>0))
     {
      PutOrder(0,Ask);
      
      ModifyOrders();
     }
   if((CountTrades(1)<1 && red1>0 && blue2>0))
     {
      PutOrder(1,Bid);
      
      ModifyOrders();
     }
     }
   }
    if(TimeCurrent()-OrderOpenTime()>=Exit)
     {
      
      CloseAll();
     } 

    if(TimeCurrent()-OrderOpenTime()>=Exit)
     {
      
      CloseAll();
     }
  
  }
//--------------------------------------------
avatar

  17  Sirojiddin Автор Сообщений: 62

  • 29 сентября 2021, 04:22
+
0
avatar

  17  Sirojiddin Автор Сообщений: 62

  • 29 сентября 2021, 04:22
+
0
Ордер необходимо закрыть в определенное время (4 часа) после открытия. Это не должно влиять на другие ордеры.
avatar

  17  Sirojiddin Автор Сообщений: 62

  • 29 сентября 2021, 04:27
+
0

По коду:
if(TimeCurrent()-OrderOpenTime()>=Exit)// в секундах
//if(TimeCurrent()-OrderOpenTime()>=Exit*60*60)// в часах
//если разница между текущем временем TimeCurrent()и временем открытия 
//позиции OrderOpenTime() в секундах больше заданного Exit в секундах
//тогда закрываем позицию.
     {
      
      CloseAll();
     }

extern int Exit = 14400;

4 часа * 3600 секунд = 14400 секунд
avatar

  16  ssg Сообщений: 817

  • 29 сентября 2021, 05:28
+
0
Вы меня не поняли.
Например: у меня есть ордер на покупку gbpusd, у меня есть ордер на продажу eurusd, и у меня есть другие ордеры.
Ордер gbpusd закрывается через 4 часа и закрывает все ордеры(Это проблема).

gbpusd должен закрываться через 4 часа и не закрывать другие ордера.
Редактирован: 29 сентября 2021, 05:40
avatar

  17  Sirojiddin Автор Сообщений: 62

  • 29 сентября 2021, 05:35
+
0
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
{
bool cl;
int dig=0;
double bid=0,ask=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderType()==0 && (ot==0 || ot==-1))
{
RefreshRates();
bid=MarketInfo(OrderSymbol(),MODE_BID);
dig=(int)MarketInfo(OrderSymbol(),MODE_DIGITS);
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(bid,dig),33,White);
}
if(OrderType()==1 && (ot==1 || ot==-1))
{
RefreshRates();
ask=MarketInfo(OrderSymbol(),MODE_ASK);
dig=(int)MarketInfo(OrderSymbol(),MODE_DIGITS);
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(ask,dig),33,White);
}
}
}
}
void OnTick()

if(TimeCurrent()-OrderOpenTime()>=Exit)
{
CloseAll(0);
}

if(TimeCurrent()-OrderOpenTime()>=Exit)
{
CloseAll(1);
}
Я думаю, что это неправильно.
Редактирован: 29 сентября 2021, 05:45
avatar

  17  Sirojiddin Автор Сообщений: 62

  • 29 сентября 2021, 05:44
+
0
В функции нет выбора позиций по идентификатору советника.Нужно записать так:
<code>//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   int dig=0;
   double bid=0,ask=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {  
         if(OrderType()==0 && (ot==0 || ot==-1))
           {
            RefreshRates();
            bid=MarketInfo(OrderSymbol(),MODE_BID);
            dig=(int)MarketInfo(OrderSymbol(),MODE_DIGITS);
            cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(bid,dig),33,White);
           }
         if(OrderType()==1 && (ot==1 || ot==-1))
           {
            RefreshRates();
            ask=MarketInfo(OrderSymbol(),MODE_ASK);
            dig=(int)MarketInfo(OrderSymbol(),MODE_DIGITS);
            cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(ask,dig),33,White);
           }
        }
     }
  }
}
Сейчас функция должна закрывать позиции только со своим магиком.
На разных парах должны быть разные магики.
</code>

Редактирован: 29 сентября 2021, 08:25
avatar

  16  ssg Сообщений: 817

  • 29 сентября 2021, 08:24
+
0
У Вас функция закрытия позиции не разделяет позиции не по символу не по магику.
Замените:
<code>
//+------------------------------------------------------------------+
//| Закрывает ордера по указанному символу с указанным магиком       |
//+------------------------------------------------------------------+
void CloseAll(string symb,string symb, int op=-1, int magic=-1)
  {
   bool cl,sel;
   for(int i=0; i<OrdersTotal(); i++)
     {
      sel=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()==symb && OrderMagicNumber()==magic)
        {
         RefreshRates();
         double bid=MarketInfo(symb,MODE_BID);
         double ask=MarketInfo(symb,MODE_ASK);
         if(OrderType()==OP_BUY) cl=OrderClose(OrderTicket(),OrderLots(),bid,Slippage,Blue);
         if(OrderType()==OP_SELL) cl=OrderClose(OrderTicket(),OrderLots(),ask,Slippage,Red);
        }
      Sleep(1000);
     }
  }</code>


Дальше записываете:
<code>
void OnTick(){

if(TimeCurrent()-OrderOpenTime()>=Exit)
{
CloseAll("EURUSD",0,Magic);
}

if(TimeCurrent()-OrderOpenTime()>=Exit)
{
CloseAll("EURUSD",1,Magic);
}
}
</code>

Только и в функции открытия позиции надо прописать нужную пару.
Редактирован: 29 сентября 2021, 08:27
avatar

  16  ssg Сообщений: 817

  • 29 сентября 2021, 08:18
+
0
Спасибо. Я попробую это.
avatar

  17  Sirojiddin Автор Сообщений: 62

  • 29 сентября 2021, 09:03
+
0
void CloseAll(string symb,string symb, int op=-1, int magic=-1)
Здесь есть ошибка?
Редактирован: 29 сентября 2021, 09:15
avatar

  17  Sirojiddin Автор Сообщений: 62

  • 29 сентября 2021, 09:13
+
0
Почему «string symb» пишется дважды?
Редактирован: 29 сентября 2021, 09:16
avatar

  17  Sirojiddin Автор Сообщений: 62

  • 29 сентября 2021, 09:16
комментарий был удален 2021-09-29 09:28:33 Sirojiddin


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