cm-rollback

Orders Execution
Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategyIt automatically opens orders when conditions are reached
0 Views
0 Downloads
0 Favorites
cm-rollback
//+------------------------------------------------------------------+
//|                               Copyright © 2015, Vladimir Hlystov |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, http://cmillion.ru"
#property link      "cmillion@narod.ru"
#property version   "1.00"
#property strict
//-------------------------------------------------------------------
extern double Lot          = 0.01;
extern double K_Martin     = 1.0;   // Óìíîæåíèå ïîñëåäóþùèõ ëîòîâ
extern double Sum_Lot      = 0.01;  // Äîáàâêà ïîñëåäóþùèõ ëîòîâ
extern double MaxLot       = 1.00;  // Ìàêñèìàëüíûé ëîò
extern int    TrailingStart= 150;
extern int    TrailingStop = 50;
extern int    Magic        = 0;
extern bool   DrawInfo     = true;  // Âûâîä èíôîðìàöèè íà ýêðàí
extern color  text_color   = Aqua;  // Öâåò âûâîäà èíôîðìàöèè
extern int    DigitsLot    = 2;     // Îêðóãëåíèå ëîòîâ îðäåðîâ 1- äåñÿòûå (0.1)  2 ñîòûå (0.01)
extern int    slippage     = 3;
//-------------------------------------------------------------------
string AC;
//-------------------------------------------------------------------
void OnTick()
  {
   if(!IsTradeAllowed())
     {
      DrawLABEL("Òîðãîâëÿ",1,0,0,Red,"Òîðãîâëÿ çàïðåùåíà");
      return;
     }
   else DrawLABEL("Òîðãîâëÿ",1,0,0,Lime,"Òîðãîâëÿ ðàçðåøåíà");
//---
   double STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
   if(TrailingStop<STOPLEVEL) TrailingStop=(int)STOPLEVEL;
//---
   double OL=0,LB=0,LS=0,price_b=0,price_s=0;
   double OSL,OTP,OOP,SL,Profit=0,ProfitB=0,ProfitS=0,MaxLotBuy=0,MaxLotSell=0;
   int i,b=0,s=0,tip;
   for(i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
           {
            tip = OrderType();
            OOP = NormalizeDouble(OrderOpenPrice(),Digits);
            OL=OrderLots();
            if(tip==OP_BUY)
              {
               price_b+= OOP*OL;
               ProfitB+=OrderProfit()+OrderCommission()+OrderSwap();
               b++;
               LB+=OL;
               if(MaxLotBuy<OL || MaxLotBuy==0) MaxLotBuy=OL;
              }
            if(tip==OP_SELL)
              {
               price_s+= OOP*OL;
               ProfitS+=OrderProfit()+OrderCommission()+OrderSwap();
               s++;
               LS+=OL;
               if(MaxLotSell<OL || MaxLotSell==0) MaxLotSell=OL;
              }
           }
        }
     }
//---
   Profit=ProfitB+ProfitS;
//---
   if(DrawInfo)
     {
      ObjectDelete("infoÁåçóáûòîê Buy");
      ObjectDelete("infoÁåçóáûòîê Sell");
      ObjectDelete("info Áåçóáûòîê Buy");
      ObjectDelete("info Áåçóáûòîê Sell");
     }
   double NLb=0,NLs=0;
   if(b>0)
     {
      NLb=NormalizeDouble(price_b/LB+TrailingStart*Point/b,Digits);
      if(DrawInfo)
        {
         ObjectCreate("infoÁåçóáûòîê Buy",OBJ_ARROW,0,Time[0],NLb,0,0,0,0);
         ObjectSet("infoÁåçóáûòîê Buy",OBJPROP_ARROWCODE,6);
         ObjectSet("infoÁåçóáûòîê Buy",OBJPROP_COLOR,Blue);
        }
     }
   if(s>0)
     {
      NLs=NormalizeDouble(price_s/LS-TrailingStart*Point/s,Digits);
      if(DrawInfo)
        {
         ObjectCreate("infoÁåçóáûòîê Sell",OBJ_ARROW,0,Time[0],NLs,0,0,0,0);
         ObjectSet("infoÁåçóáûòîê Sell",OBJPROP_ARROWCODE,6);
         ObjectSet("infoÁåçóáûòîê Sell",OBJPROP_COLOR,Red);
        }
     }
//---
   if(b+s>0)
     {
      for(i=0; i<OrdersTotal(); i++)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
              {
               tip = OrderType();
               OSL = NormalizeDouble(OrderStopLoss(),Digits);
               OTP = NormalizeDouble(OrderTakeProfit(),Digits);
               OOP = NormalizeDouble(OrderOpenPrice(),Digits);
               SL=OSL;
               if(tip==OP_BUY)
                 {
                  SL=NormalizeDouble(Bid-TrailingStop*Point,Digits);
                  if(SL>OSL && SL>NLb)
                    {
                     if(!OrderModify(OrderTicket(),OOP,SL,0,0,White)) Print("Error Order Modify ",GetLastError());
                    }
                 }
               if(tip==OP_SELL)
                 {
                  SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
                  if((SL<OSL || OSL==0) && SL<NLs)
                    {
                     if(!OrderModify(OrderTicket(),OOP,SL,0,0,White)) Print("Error Order Modify ",GetLastError());
                    }
                 }
              }
           }
        }
     }
//---
   double AB=AccountBalance();
//---
   DrawLABEL("Balance",1,5,20,text_color,StringConcatenate("Balance ",DoubleToStr(AB,2),AC));
   DrawLABEL("Equity",1,5,40,text_color,StringConcatenate("Equity ",DoubleToStr(AccountEquity(),2),AC));
   DrawLABEL("FreeMargin",1,5,60,text_color,StringConcatenate("FreeMargin ",DoubleToStr(AccountFreeMargin(),2),AC));
   DrawLABEL("Take",1,5,80,Color(Profit>0,Lime,Red),StringConcatenate("Profit ",DoubleToStr(Profit,2),AC));
   DrawLABEL("Âñåãî ëîò Buy",1,5,100,Color(ProfitB>0,Lime,Red),StringConcatenate("Buy ",b," | ",DoubleToStr(LB,DigitsLot)," | ",DoubleToStr(ProfitB,2),AC));
   DrawLABEL("Âñåãî ëîò Sell",1,5,120,Color(ProfitS>0,Lime,Red),StringConcatenate("Sell ",s," | ",DoubleToStr(LS,DigitsLot)," | ",DoubleToStr(ProfitS,2),AC));
//---
   double lot=NormalizeDouble(Lot*MathPow(K_Martin,MathMax(b,s))+Sum_Lot*MathMax(b,s),2);
   if(lot>MaxLot) return;
   if(AccountFreeMarginCheck(Symbol(),OP_SELL,lot)+AccountFreeMarginCheck(Symbol(),OP_BUY,lot)>0)
      if(b==0 || s==0)
        {
         if(OrderSend(Symbol(),OP_BUY,lot,NormalizeDouble(Ask,Digits),slippage,0,0,NULL,Magic,0,CLR_NONE)==-1)
            Print("Îøèáêà ",GetLastError()," îòêðûòèÿ îðäåðà ");
         //---
         if(OrderSend(Symbol(),OP_SELL,lot,NormalizeDouble(Bid,Digits),slippage,0,0,NULL,Magic,0,CLR_NONE)==-1)
            Print("Îøèáêà ",GetLastError()," îòêðûòèÿ îðäåðà ");
        }
   return;
  }
//------------------------------------------------------------------
void OnDeinit(const int reason)
  {
   if(DrawInfo && !IsTesting())
     {
      ObjectsDeleteAll(0);
     }
  }
//-------------------------------------------------------------------
void DrawLABEL(string name,int CORNER,int X,int Y,color clr,string Name)
  {
   if(!DrawInfo) return;
   if(ObjectFind(name)!=-1) ObjectDelete(name);
   ObjectCreate(name,OBJ_LABEL,0,0,0);
   ObjectSet(name,OBJPROP_CORNER,CORNER);
   ObjectSet(name,OBJPROP_XDISTANCE,X);
   ObjectSet(name,OBJPROP_YDISTANCE,Y);
   ObjectSetText(name,Name,12,"Arial",clr);
  }
//+------------------------------------------------------------------+
int OnInit()
  {
   AC=StringConcatenate(" ",AccountCurrency());
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
color Color(bool P,color a,color b)
  {
   if(P) return(a);
   else return(b);
  }
//------------------------------------------------------------------

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 ---