Закрытие всех ордеров по общему профиту

nikola86

Новичок форума
Вот собственно код
Код:
if (CurProfit>TakeProfit)
     {
for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
      if (OrderType()==OP_BUY) OrderClose (OrderTicket(),OrderLots(),Ask,slippage,CLR_NONE);
   }
 for (int j=OrdersTotal()-1; j>=0; j--)  
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
     if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),Bid,slippage,CLR_NONE);
}
}
При закрытии ордера возникает ошибка 138. Подскажите, пожалуйста, что не так в коде?
 

aspirine

Новичок форума
Вот собственно код
Код:
if (CurProfit>TakeProfit)
     {
for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
      if (OrderType()==OP_BUY) OrderClose (OrderTicket(),OrderLots(),Ask,slippage,CLR_NONE);
   }
 for (int j=OrdersTotal()-1; j>=0; j--)  
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
     if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),Bid,slippage,CLR_NONE);
}
}
При закрытии ордера возникает ошибка 138. Подскажите, пожалуйста, что не так в коде?

Ошибка 138 - новые цены. Возникает когда советник посылает запрос на закрытие ордера, а в это время цена меняется.
Поставьте побольше проскальзывание, но при этом разница между несколькими закрытыми ордерами будет больше.
 

nikola86

Новичок форума
увеличение slippage ничего не меняет-ошибка остается.
 

nikola86

Новичок форума
Вот сам код, только начал писать и уже сталкнулся с проблемой: 2 ордера открываются, общий профит считается, но ордера по общему профиту не закрываются. В чем проблема?
Код:
extern string _P_Expert = "---------- Параметры советника";
extern bool   CurSymbolOnly   = True;            // Только текущий символ
extern int    TakeProfit      = 10;              // Тейк
extern bool   ShowComment     = True;            // Показывать комментарий
extern int    NumberAccount   = 0;               // Номер торгового счёта
extern bool   UseSound        = False;           // Использовать звуковой сигнал
extern string NameFileSound   = "expert.wav";    // Наименование звукового файла
extern int    Slippage        = 3;               // Проскальзывание цены
extern int    NumberOfTry     = 5;               // Количество попыток
extern int    PauseAfterError = 75;              // Пауза после ошибки в секундах
extern int       Lot=1; 
//------- Глобальные переменные советника --------------------------------------
color clCloseBuy  = Blue;         // Цвет значка закрытия покупки
color clCloseSell = Red;          // Цвет значка закрытия продажи
int   CurProfit;
 int slippage=5;
  

//------- Поключение внешних модулей -------------------------------------------
#include <stdlib.mqh>
#include <WinUser32.mqh> 
 
//+----------------------------------------------------------------------------+
//|  expert initialization function                                            |
//+----------------------------------------------------------------------------+
void init() { if (!IsTesting()) Comment(""); }
 
//+----------------------------------------------------------------------------+
//|  expert deinitialization function                                          |
//+----------------------------------------------------------------------------+
void deinit() { if (!IsTesting()) Comment(""); }
 
//+----------------------------------------------------------------------------+
//|  expert start function                                                     |
//+----------------------------------------------------------------------------+

void start() {
  {
  double Free =AccountFreeMargin();
  double Step =MarketInfo(Symbol(),MODE_LOTSTEP);
  double price;
 int total=OrdersTotal();

     if (total==0)
        {
          OrderSend(Symbol(),OP_SELL,Lot,Bid,3,0,0,0,0,CLR_NONE);
          OrderSend(Symbol(),OP_BUY,Lot*2,Ask,3,0,0,0,0,CLR_NONE);
        }
     if (CurProfit>TakeProfit)  
     {   
for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
      if (OrderType()==OP_BUY) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage,CLR_NONE);
   }
 for (int j=OrdersTotal()-1; j>=0; j--)  
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
     if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage,CLR_NONE);
}

}
   }
  if (TakeProfit>0) CloseByProfit();
  if (ShowComment) {
  
    Comment("Текущий профит=",CurProfit," п.","  Профит закрытия=",TakeProfit," п.");
 
  }
}


//+----------------------------------------------------------------------------+
//|  Определение общего профита.                                         |
//+----------------------------------------------------------------------------+
void CloseByProfit() {
  double p;
  int    i, k=OrdersTotal(), pr=0;
 
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (!CurSymbolOnly || OrderSymbol()==Symbol()) {
        p=MarketInfo(OrderSymbol(), MODE_POINT);
        if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.0001; else p=0.01;
        if (OrderType()==OP_BUY) {
          pr+=NormalizeDouble((OrderClosePrice()-OrderOpenPrice())/p, 0);
        }
        if (OrderType()==OP_SELL) {
          pr+=NormalizeDouble((OrderOpenPrice()-OrderClosePrice())/p, 0);
        }
      }
    }
  }
  CurProfit=pr;
}
 
//+----------------------------------------------------------------------------+
//|  Вывод сообщения в коммент и в журнал                                      |
//+----------------------------------------------------------------------------+
void Message(string m) {
  Comment(m);
  if (StringLen(m)>0) Print(m);
}
 

Юрий FT

Модератор
Попробуйте так:

Код:
if(SummPos(1)+SummPos(2)>СуммаПрибыли){CloseAllPos(1); CloseAllPos(2);}


//Закрываем все позиции по типу
int CloseAllPos(int type)
{//Описание функции: [url=http://fxnow.ru/blog.php?user=Yuriy&blogentry_id=72]Социальная сеть биржевых трейдеров. Forex - прямо сейчас.[/url]
int buy=1; int sell=1;
int i,b=0;int ordertiket;
 
 if(type==1)
   {
   while(buy==1)
     {
        buy=0;
        for( i=0;i<OrdersTotal();i++)
         {
           if(true==OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
           if(OrderType()==OP_BUY && OrderSymbol()==Symbol() ){buy=1; OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);}
           }else{buy=0;}
         }  
         if(buy==0){return(0);}
      } 
   }
   
   if(type==0)
   {
      while(sell==1)
     {
        sell=0;
        for( i=0;i<OrdersTotal();i++)
         {
           if(true==OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
           if(OrderType()==OP_SELL && OrderSymbol()==Symbol() ){sell=1;OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); }
           }else{sell=0;}
         }  
         
        if(sell==0){return(0);}
      } 
     }
   return(0);
   }
 

 //суммирует результат позиций по типу
int SummPos(int type) 
{//подробное описание: [url=http://fxnow.ru/blog.php?user=Yuriy&blogentry_id=100]Социальная сеть биржевых трейдеров. Forex - прямо сейчас.[/url]

   int i;double summ;
   for( i=1; i<=OrdersTotal(); i++)         
   {
      if(OrderSelect(i-1,SELECT_BY_POS)==true) 
       {                                   
           if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && type==1&& OrderMagicNumber()==MG){summ=summ+OrderProfit();}
           if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && type==0&& OrderMagicNumber()==MG){summ=summ+OrderProfit();}
       }
    }   
return(summ);
}
 
Верх