Orders Execution
Checks for the total of open ordersIt automatically opens orders when conditions are reachedIt can change open orders parameters, due to possible stepping strategy
0 Views
0 Downloads
0 Favorites
Piz
//+------------------------------------------------------------------------+
//+ Còðàòåãèÿ îðèåíòèðîâàíà íà âëèâàíèå â õîðîøèé äâèæíÿê.                 +
//+ Îòêðûâàåì êàæäûå íåñêîëüêî ñåêóíä îòëîæåííûå ñòîï-îðäåðà â îáå ñòîðîíû +
//+ ñ ó÷¸òîì ïðîáîÿ çàäàííîãî óðîâíÿ â òå÷åíèå îòâåä¸ííîãî âðåìåíè.        +
//+ Ñàìûé ñòàðûé îðäåð çàêðûâàåòñÿ, âìåñòî íåãî îòêðûâàåòñÿ íîâûé...       +
//+ Åñëè îðäåð ñðàáîòàë îñòàëüíûå çàêðûâàþòñÿ.                             +
//+------------------------------------------------------------------------+
#define MAGIC  20101012

extern double Lots               = 0.01;
extern bool   UseRisk            = true;
extern double MaximumRisk        = 0.1;
extern double DecreaseFactor     = 3;
extern double Proboy             = 300;
extern double StopLoss           = 300; 
extern double TakeProfit         = 300; 
extern double TrailingStop       = 100;
extern int    OrdersTime         = 20;  // îáùèé ïðîìåæóòîê âðåìåíè âûñòàâëåíèÿ ðÿäà ñòîï-îðäåðîâ
extern int    SleepTime          = 5;   // ÷åðåç ñêîëüêî ñåêóíä äîáàâëÿòü íîâûé îðäåð
extern int    StartHour          = 10;  // âðåìÿ (÷àñ) íà÷àëà âíóòðèäíåâíîé òîðãîâëè
extern int    EndHour            = 22;  // âðåìÿ (÷àñ) îêîí÷àíèÿ âíóòðèäíåâíîé òîðãîâëè

datetime t;
bool flag=false;
int arr[300,2];
int order = 0;
int MaxOrders = 0;

void init()
{
  MaxOrders = MathRound(OrdersTime / SleepTime);
  Print("MaxOrders = ",MaxOrders);
  for (int i=0; i<300; i++)
  {
    arr[i,0]=0;
    arr[i,1]=0;
  }
}
//+------------------------------------------------------------------+
//| ñ÷èòàåì êîëè÷åñòâî îòëîæåííûõ ñòîï îðäåðîâ                       |
//+------------------------------------------------------------------+
int CalculateCurrentOrders1(string symbol)
{
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUYSTOP)  buys++;
         if(OrderType()==OP_SELLSTOP) sells++;
        }
     }
//---- return orders volume
   return(buys+sells);   
}

//+------------------------------------------------------------------+
//| ñ÷èòàåì êîëè÷åñòâî îòêðûòûõ îðäåðîâ                              |
//+------------------------------------------------------------------+
int CalculateCurrentOrders2(string symbol)
{
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//---- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
}

//+------------------------------------------------------------------+
//| ñ÷èòàåì ðàçìåð ëîòà                                              |
//+------------------------------------------------------------------+
double LotsOptimized()
{
   double lot=Lots;
   int    orders=HistoryTotal();     // history orders total
   int    losses=0;                  // number of losses orders without a break

   if (!UseRisk)
     return(Lots);

//---- select lot size
   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,2);
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
   {
     for(int i=orders-1;i>=0;i--)
     {
       if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
       if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
       //----
       if(OrderProfit()>0) break;
       if(OrderProfit()<0) losses++;
     }
     if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,2);
   }
//---- return lot size
   if(lot<0.01) lot=0.01;
   return(lot);
}

//+------------------------------------------------------------------+
//| âûñòàâëÿåì îòëîæåííûå ñòîï-îðäåðà                                |
//+------------------------------------------------------------------+
void StartOpen()
{
  if((TimeLocal()-t)<SleepTime) return(0);
  
  order++;
  arr[order,0]=OrderSend(Symbol(),OP_SELLSTOP,LotsOptimized(),Bid-Proboy*Point,10,Ask-Proboy*Point+StopLoss*Point,Bid-Proboy*Point-TakeProfit*Point,"",MAGIC,0,Red);
  arr[order,1]=OrderSend(Symbol(),OP_BUYSTOP,LotsOptimized(),Ask+Proboy*Point,10,Bid+Proboy*Point-StopLoss*Point,Ask+Proboy*Point+TakeProfit*Point,"",MAGIC,0,Blue); 
  
  flag = false;
  t = TimeLocal();
  return(0);
}
     
void WorkOpen()
{ 
  arr[order,0]=OrderSend(Symbol(),OP_SELLSTOP,LotsOptimized(),Bid-Proboy*Point,10,Ask-Proboy*Point+StopLoss*Point,Bid-Proboy*Point-TakeProfit*Point,"",MAGIC,0,Red);
  arr[order,1]=OrderSend(Symbol(),OP_BUYSTOP,LotsOptimized(),Ask+Proboy*Point,10,Bid+Proboy*Point-StopLoss*Point,Ask+Proboy*Point+TakeProfit*Point,"",MAGIC,0,Blue); 
  return(0);
}     

//+------------------------------------------------------------------+
//| óäàëÿåì ïåðâûé (ëåâûé) îòëîæåííûé ñòîï-îðäåð
//+------------------------------------------------------------------+
void DeleteFirstOrder()
{
  int res;
  if(OrderSelect(arr[1,0],SELECT_BY_TICKET,MODE_TRADES))
    if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
    {
      if(OrderType()==OP_SELLSTOP)
        res=OrderDelete(OrderTicket());
      if(OrderType()==OP_BUYSTOP)
        res=OrderDelete(OrderTicket());
    }   
  if(OrderSelect(arr[1,1],SELECT_BY_TICKET,MODE_TRADES))
    if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
    {
      if(OrderType()==OP_SELLSTOP)
        res=OrderDelete(OrderTicket());
      if(OrderType()==OP_BUYSTOP)
        res=OrderDelete(OrderTicket());
    }
  for (int i=1; i<=MaxOrders-1; i++)
  {
    arr[i,0]=arr[i+1,0];
    arr[i,1]=arr[i+1,1];
  }
  arr[MaxOrders,0]=0;
  arr[MaxOrders,1]=0;
}

//+------------------------------------------------------------------+
//| ìîäèôèöèðóåì ñòîï-îðäåðà - äåðæèìñÿ íà ðàññòîÿíèè îò öåíû        |
//+------------------------------------------------------------------+
void StartModify()
{
   // ìîäèôèöèðóåì ñ çàäàííûì èíòåðâàëîì âðåìåíè
   if((TimeLocal()-t)<SleepTime) return(0);
   Print("-------------------------------------------------------------");
   DeleteFirstOrder();
   WorkOpen();
   t = TimeLocal();
}

//+------------------------------------------------------------------+
//| óäàëÿåì îòëîæåííûå ñòîï-îðäåðà                                   |
//+------------------------------------------------------------------+
void DeleteStopOrders()
{
  int res;
  for(int i=0;i<OrdersTotal();i++)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
    if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
    {
      if(OrderType()==OP_SELLSTOP)
        res=OrderDelete(OrderTicket());
      if(OrderType()==OP_BUYSTOP)
        res=OrderDelete(OrderTicket());
  
      if(OrderType()==OP_BUY)
        Print("* * * BUY * * *");
      if(OrderType()==OP_SELL)
        Print("* * * SELL * * *");
    }
  }   

  for (i=1; i<=MaxOrders; i++)
  {
    arr[i,0]=0;
    arr[i,1]=0;    
  }
  order=0;
  flag=true;
}

//+------------------------------------------------------------------+
//| Ðåàëèçóåì òðýéëèíã-ñòîï äëÿ îòêðûòîãî îðäåðà                     |
//+------------------------------------------------------------------+
void StartTrailing()
{ 
  bool res;
  for(int i=0;i<OrdersTotal();i++)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
    if(OrderMagicNumber()!=MAGIC || OrderSymbol()!=Symbol()) continue;

    if(OrderType()==OP_BUY)
    {     
      if(TrailingStop>0)
      {
        if(Bid-OrderOpenPrice() > TrailingStop*Point)
        {
          if(OrderStopLoss()<Bid-TrailingStop*Point)
          {
            res=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Point,OrderTakeProfit(),0,Blue);
            Print("* * * Ìîäèôèöèðóþ BUY! = ",res);
            return(0);
          }
        }
      }
    }
    if(OrderType()==OP_SELL)
    {    
      if(TrailingStop>0)
      {
        if(OrderOpenPrice()-Ask > TrailingStop*Point)
        {
          if(OrderStopLoss()>Ask+TrailingStop*Point)
          {
            
            res=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,OrderTakeProfit(),0,Blue);
            Print("* * * Ìîäèôèöèðóþ SELL! = ",res);
            return(0);
          }
        }
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Start                                                            |
//+------------------------------------------------------------------+
void start()
{
   if(Bars<100 || IsTradeAllowed()==false) return;
   if(Hour()<StartHour || Hour()>EndHour) return;

   // åñëè ñðàáîòàë îòëîæåííûé îðäåð
   if(CalculateCurrentOrders2(Symbol())!=0)
   {
     if(!flag)
       DeleteStopOrders();  // óäàëÿåì îñòàâøèåñÿ îòëîæåííûå îðäåðà
     StartTrailing();     // ñëåäèì çà îòêðûòûì îðäåðîì
     return(0);
   }

     
   // åñëè åù¸ íåò îòëîæåííûõ îðäåðîâ
   if(CalculateCurrentOrders1(Symbol())<MaxOrders)
     StartOpen();

   // åñëè åñòü îòëîæåííûå îðäåðà
   if(CalculateCurrentOrders1(Symbol())==MaxOrders)
     StartModify();
  
//----
}
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---