Ответить
16.09.2010, 16:52
Аватар для nikola86
nikola86 nikola86 вне форума Активный участник
Регистрация: 28.09.2009 / Сообщений: 12
Поблагодарили 2 раз(а) / Репутация: 2

По умолчанию Закрытие всех ордеров по общему профиту

Вот собственно код
Код:
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. Подскажите, пожалуйста, что не так в коде?
16.09.2010, 17:20
Аватар для aspirine
aspirine aspirine вне форума Интересующийся
Регистрация: 19.12.2009 / Сообщений: 28
Поблагодарили 6 раз(а) / Репутация: 4
Вот собственно код
Код:
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 - новые цены. Возникает когда советник посылает запрос на закрытие ордера, а в это время цена меняется.
Поставьте побольше проскальзывание, но при этом разница между несколькими закрытыми ордерами будет больше.
16.09.2010, 17:39
Аватар для nikola86
nikola86 nikola86 вне форума Активный участник
Регистрация: 28.09.2009 / Сообщений: 12
Поблагодарили 2 раз(а) / Репутация: 2
увеличение slippage ничего не меняет-ошибка остается.
17.09.2010, 17:45
Аватар для aspirine
aspirine aspirine вне форума Интересующийся
Регистрация: 19.12.2009 / Сообщений: 28
Поблагодарили 6 раз(а) / Репутация: 4
увеличение slippage ничего не меняет-ошибка остается.
не посмотрел, цена закрытия Buy - Bid ,
замени Ask на MarketInfo(OrderSymbol(),MODE_BID)

цена Sell - Ask , соответственно замени на MarketInfo(OrderSymbol(),MODE_ASK)
20.09.2010, 05:48
Аватар для nikola86
nikola86 nikola86 вне форума Активный участник
Регистрация: 28.09.2009 / Сообщений: 12
Поблагодарили 2 раз(а) / Репутация: 2
Вот сам код, только начал писать и уже сталкнулся с проблемой: 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);
}
07.10.2010, 17:54
Регистрация: 05.08.2008 / Сообщений: 766
Поблагодарили 273 раз(а) / Репутация: 510
Попробуйте так:

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


//Закрываем все позиции по типу
int CloseAllPos(int type)
{//Описание функции: Социальная сеть биржевых трейдеров. Forex - прямо сейчас.
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) 
{//подробное описание: Социальная сеть биржевых трейдеров. Forex - прямо сейчас.

   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);
}
Ответить


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скачать бесплатно скрипты для закрытия всех открытых ордеров FXWizard Скрипты 52 25.01.2014 12:33


Текущее время: 01:49. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
SEO by vBSEO