Подскажите, какая функция или скрипт описывает закрытие перекрытых ордеров? - страница 2

 
hoziain:

Я попрбовал последовать Вашему совету, не идти против рынка, т.е. заменил доливку на встречную, если получится прикрепить файл, см.
По моему, Вы меня не поняли. Совет "не идти против рынка" относится к Вашей стратегии в целом, не усредняться против рынка - это так сказать "аксиома" трейдинга (не я ее выдумал). Есть такая поговорка в трейдерском сообществе: "Усреднение на падающем рынке сгубило больше евреев чем Адольф Гитлер". :)
Это предостережение я сделал специально, чтобы меня не обвиняли в том что я даю Вам советы относительно того как неправильно торговать.
Сами же советы касались именно Вашей стратегии (как я ее понял). Т.е. я Вам пояснил как проще определить суммарную прибыльность всех открытых позиций. А затем показал как максимально гарантированно закрыть все однонаправленные позиции В ОДНОЙ ТОЧКЕ, ибо закрытие циклом не гарантирует качественного исполнения (цена может уйти, сервер может перестать отвечать, могут пойти реквоты на команды закрытия). При большом количестве однонаправленных ордеров закрытие циклом не может гарантировать исполнение команды в одной нужной точке, следовательно нельзя быть уверенным в точной фиксации прибыли. Если же открыть встречный ордер с объемом равным суммарному объему перекрываемых ордеров, то Вы фиксируете "точку закрытия", дальнейшее изменение цены уже не влияет на результат операции сколько бы времени не заняла процедура взаимозакрытия ордеров (естественно в пределах текущих суток чтобы своп не начислялся). При открытии встречного ордера правда "съедается" спред, но он аннулируется при командах взаимозакрытия ордеров.
 
Кажется Simca говорит об этом:

//+------------------------------------------------------------------+
//|                                                   _Open_LOCK.mq4 |
//|                                           "СКРИПТЫ ДЛЯ ЛЕНИВОГО" |
//|             Скрипт открывает один LOCK для всех открытых позиций |
//|                                  (если хватит денюшки)           |
//|                           Bookkeeper, 2006, yuzefovich@gmail.com |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property show_inputs // Если есть желание менять экстерны в процессе
//+------------------------------------------------------------------+
extern int    DistSL     = 35;   // StopLoss в пунктах
extern int    DistTP     = 35;   // TakeProfit в пунктах
extern int    Slippage   = 7;    // Проскальзывание
extern bool   StopLoss   = true; // Ставить или нет
extern bool   TakeProfit = true; // Ставить или нет
//+------------------------------------------------------------------+
void start() 
{
int    Total,i,Pos,Error,MinLotDgts;
int    Result;
double MinLot=MarketInfo(Symbol(),MODE_MINLOT);   
double SL=0,TP=0,Stake,BuyLots=0,SellLots=0;
int    Dgts=MarketInfo(Symbol(),MODE_DIGITS);     
  Total=OrdersTotal();
  if(Total>0) // Если есть ордера
  {
     for(i=Total-1; i>=0; i--) 
     {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)  
        {
           Pos=OrderType();
           Stake=OrderLots();
           if((OrderSymbol()==Symbol()) &&
              (Pos==OP_BUY || Pos==OP_SELL)) // Смотрим только открытые Buy и Sell
           {                                 // в активном окне
              if(Pos==OP_BUY) BuyLots=BuyLots+Stake; // Суммируем Лоты открытых Buy
              else SellLots=SellLots+Stake; // Суммируем Лоты открытых Sell
           }
        }
     }
     if(MinLot<0.1) MinLotDgts=2;
     else
     {
        if(MinLot<1.0) MinLotDgts=1;
        else MinLotDgts=0;
     }
     Stake=NormalizeDouble(BuyLots-SellLots,MinLotDgts);
     if(Stake!=0) // Если есть что ЛОКировать
     {
        if(Stake>0) // ЛОКируем продажей
        {
           if(StopLoss==true) SL=Ask+DistSL*Point;
           if(TakeProfit==true) TP=Bid-2*DistTP*Point;
           Result=OrderSend(Symbol(),OP_SELL,Stake,
                            NormalizeDouble(MarketInfo(Symbol(),MODE_BID),Dgts),
                            Slippage,
                            NormalizeDouble(SL,Dgts),
                            NormalizeDouble(TP,Dgts),
                            "",0,0,CLR_NONE);
        }
        else // ЛОКируем покупкой
        {
           Stake=-Stake;
           if(StopLoss==true) SL=Bid-DistSL*Point;
           if(TakeProfit==true) TP=Ask+2*DistTP*Point;
           Result=OrderSend(Symbol(),OP_BUY,Stake,
                            NormalizeDouble(MarketInfo(Symbol(),MODE_ASK),Dgts),
                            Slippage,
                            NormalizeDouble(SL,Dgts),
                            NormalizeDouble(TP,Dgts),
                            "",0,0,CLR_NONE);
        }
        if(Result<=0) 
        { 
           Error=GetLastError(); 
           Alert("_Open_LOCK: LastError = ",Error); 
        }
        else Error=0;
     }
     else Alert("_Open_LOCK: BuyLots=SellLots");
  }
   return(0);
}
//+------------------------------------------------------------------+
И дальше рули в любую сторону...
 
Bookkeeper писал (а):
Кажется Simca говорит об этом:

//+------------------------------------------------------------------+
//|                                                   _Open_LOCK.mq4 |
//|                                           "СКРИПТЫ ДЛЯ ЛЕНИВОГО" |
//|             Скрипт открывает один LOCK для всех открытых позиций |
//|                                  (если хватит денюшки)           |
//|                           Bookkeeper, 2006, yuzefovich@gmail.com |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property show_inputs // Если есть желание менять экстерны в процессе
//+------------------------------------------------------------------+
extern int    DistSL     = 35;   // StopLoss в пунктах
extern int    DistTP     = 35;   // TakeProfit в пунктах
extern int    Slippage   = 7;    // Проскальзывание
extern bool   StopLoss   = true; // Ставить или нет
extern bool   TakeProfit = true; // Ставить или нет
//+------------------------------------------------------------------+
void start() 
{
int    Total,i,Pos,Error,MinLotDgts;
int    Result;
double MinLot=MarketInfo(Symbol(),MODE_MINLOT);   
double SL=0,TP=0,Stake,BuyLots=0,SellLots=0;
int    Dgts=MarketInfo(Symbol(),MODE_DIGITS);     
  Total=OrdersTotal();
  if(Total>0) // Если есть ордера
  {
     for(i=Total-1; i>=0; i--) 
     {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)  
        {
           Pos=OrderType();
           Stake=OrderLots();
           if((OrderSymbol()==Symbol()) &&
              (Pos==OP_BUY || Pos==OP_SELL)) // Смотрим только открытые Buy и Sell
           {                                 // в активном окне
              if(Pos==OP_BUY) BuyLots=BuyLots+Stake; // Суммируем Лоты открытых Buy
              else SellLots=SellLots+Stake; // Суммируем Лоты открытых Sell
           }
        }
     }
     if(MinLot<0.1) MinLotDgts=2;
     else
     {
        if(MinLot<1.0) MinLotDgts=1;
        else MinLotDgts=0;
     }
     Stake=NormalizeDouble(BuyLots-SellLots,MinLotDgts);
     if(Stake!=0) // Если есть что ЛОКировать
     {
        if(Stake>0) // ЛОКируем продажей
        {
           if(StopLoss==true) SL=Ask+DistSL*Point;
           if(TakeProfit==true) TP=Bid-2*DistTP*Point;
           Result=OrderSend(Symbol(),OP_SELL,Stake,
                            NormalizeDouble(MarketInfo(Symbol(),MODE_BID),Dgts),
                            Slippage,
                            NormalizeDouble(SL,Dgts),
                            NormalizeDouble(TP,Dgts),
                            "",0,0,CLR_NONE);
        }
        else // ЛОКируем покупкой
        {
           Stake=-Stake;
           if(StopLoss==true) SL=Bid-DistSL*Point;
           if(TakeProfit==true) TP=Ask+2*DistTP*Point;
           Result=OrderSend(Symbol(),OP_BUY,Stake,
                            NormalizeDouble(MarketInfo(Symbol(),MODE_ASK),Dgts),
                            Slippage,
                            NormalizeDouble(SL,Dgts),
                            NormalizeDouble(TP,Dgts),
                            "",0,0,CLR_NONE);
        }
        if(Result<=0) 
        { 
           Error=GetLastError(); 
           Alert("_Open_LOCK: LastError = ",Error); 
        }
        else Error=0;
     }
     else Alert("_Open_LOCK: BuyLots=SellLots");
  }
   return(0);
}
//+------------------------------------------------------------------+
И дальше рули в любую сторону...
Благодарю. Попробую совсем этим разобраться.
 

Уважаемые!

Может есть у кого скрипт, закрывающий все ордера при условии, если средства превысили баланс на 5%?

Неужели я первый, кому это понадобилось? 

 
torn:

Уважаемые!

Может есть у кого скрипт, закрывающий все ордера при условии, если средства превысили баланс на 5%?

Неужели я первый, кому это понадобилось? 

Интересно?  А тему Вы прочитали и ничего не нашли? В таком случае Вам трудно помочь. 
 
////////////////////////////////////////////////////////////////////////////////
void Close_all_by()
{
int cur_ticket;


for(int i=OrdersTotal()-1; i>=0; i--)
 {
 if(OrderSelect(i, SELECT_BY_POS))
 {
 if(OrderMagicNumber()==Magic)
 {
 if(OrderSymbol()==Symbol())
 {
 //BUY
 if(OrderType()==OP_BUY)
 {
 cur_ticket=OrderTicket();
 for(int y=i-1; y>=0; y--)
 {
 if(OrderSelect(y, SELECT_BY_POS))
 {
 if(OrderMagicNumber()==Magic)
 {
 if(OrderSymbol()==Symbol())
 {
 if(OrderType()==OP_SELL)
 {
 i++;
 if(OrderCloseBy(OrderTicket(),cur_ticket)) break;
 }
 }
 }
 } 
 }
 }//end if buy
 else
 //SELL
 if(OrderType()==OP_SELL)
 {
 cur_ticket=OrderTicket();
 for(int y2=i-1; y2>=0; y2--)
 {
 if(OrderSelect(y2, SELECT_BY_POS))
 {
 if(OrderMagicNumber()==Magic)
 {
 if(OrderSymbol()==Symbol())
 {
 if(OrderType()==OP_BUY)
 {
 i++;
 if(OrderCloseBy(OrderTicket(),cur_ticket)) break;
 }
 }
 }
 } 
 }
 }//end if sell
 }
 }
 }
 }
 

}