JQS_Terminator_Line_v1_1_0

Author: Copyright � 2010, JQS aka Joo.
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 strategyChecks for the total of closed orders
0 Views
0 Downloads
0 Favorites
JQS_Terminator_Line_v1_1_0
//+----------------------------------------------------------------------+
//|                                           JQS Terminator Line v1.1.0 |
//|                                       Copyright © 2010, JQS aka Joo. |
//|                                     http://www.mql4.com/ru/users/joo |
//+----------------------------------------------------------------------+
//|   Òåðìèíàòîð (àñòðîíîìèÿ) (îò ëàò. terminare — îãðàíè÷èâàòü) — ëèíèÿ |
//| ñâåòîðàçäåëà, îòäåëÿþùàÿ îñâåù¸ííóþ (ñâåòëóþ) ÷àñòü íåáåñíîãî òåëà îò|
//| íåîñâåù¸ííîé (ò¸ìíîé) ÷àñòè.                                         |
//|                                                                      |
//|   Òåðìèíàòîð (ÄÍÊ) — ïîñëåäîâàòåëüíîñòü íóêëåîòèäîâ ÄÍÊ, óçíàâàåìàÿ  |
//| ÐÍÊ-ïîëèìåðàçîé êàê ñèãíàë ê ïðåêðàùåíèþ ñèíòåçà ìîëåêóëû ÐÍÊ è      |
//| äèññîöèàöèè òðàíñêðèïöèîííîãî êîìïëåêñà.                             |
//|                                                                      |
//|   Òåðìèíàòîð (ýëåêòðîíèêà) — ïîãëîòèòåëü ýíåðãèè (îáû÷íî ðåçèñòîð) íà|
//| êîíöå äëèííîé ëèíèè, ñîïðîòèâëåíèå êîòîðîãî ðàâíî âîëíîâîìó          |
//| ñîïðîòèâëåíèþ ëèíèè.                                                 |
//+----------------------------------------------------------------------+
#property copyright "Copyright © 2010, JQS aka Joo."
#property link      "http://www.mql4.com/ru/users/joo"
//-----------------------------------------------------

//-------------------Ââîä ãëîáàëüíûõ ïåðåìåííûõ---------------------------
extern string   MM         = "-----------Óïðàâëåíèå êàïèòàëîì--------";
extern double   K_Martin   =1.0;  //Êîýôô Ìàðòèíà
extern double   MinLoss    =1.0;  //Ìèí. âîçìîæíûé óáûòîê â âàëþòå äåïî
extern double   ProfitRatio=1.0;  //Îòíîøåíèå TP/SL
extern int      SLdefault  =20;   //Îòíîñèòåëüíûé ðàçìåð SL
//------------------------------------------------------------------------

//-------------------Ãëîáàëüíûå ïåðåìåííûå--------------------------------
double TP;            //Îòíîñèòåëüíûé ðàçìåð        
double TakeProfit;    //Àáñîëþòíàÿ âåëè÷èíà ðàññòîÿíèÿ îò TP äî ask/bid
double TPline;        //Àáñîëþòíàÿ âåëè÷èíà ëèíè TP

double SL;            //Îòíîñèòåëüíûé ðàçìåð 
double StopLoss;      //Àáñîëþòíàÿ âåëè÷èíà ðàññòîÿíèÿ îò SL äî ask/bid
double SLline;        //Àáñîëþòíàÿ âåëè÷èíà ëèíè SL

string UsersOrderType;

double Loss;          //Òåêóùèé äîïóñòèìûé óáûòîê â âàëþòå äåïî
double Loss_Prev;     //Ïðåäûäóùèé äîïóñòèìûé óáûòîê â âàëþòå äåïî
double Lots_New;      //Êîëè÷åñòâî ëîòîâ äëÿ íîâûõ îðäåðîâ
//------------------------------------------------------------------------

//========================================================================
int init()
{
  //-------------------------------------
  Loss_Prev=MinLoss;
  //-------------------------------------
  return;
}
//========================================================================

//========================================================================
int start()
{ 
  //-------------------------------------
  if (OrdersTotal()>=1)
  {
    ObjectDelete("SignalLineSL");
    ObjectDelete("SignalLineTP");
  } else
  {
    LineDraw();
    LineSens();
    Criterion();//Çàöèêëåííàÿ ôóíêöèÿ
    //-------------------------------------
    OpenOrder();
    //-------------------------------------
  }
  //-------------------------------------
  return;
}
//========================================================================

//========================================================================
int deinit()
{
  //-------------------------------------
  ObjectDelete("SignalLineSL");
  ObjectDelete("SignalLineTP");
  //-------------------------------------
  return;
}
//========================================================================

//========================================================================
void Criterion()
{
  bool Flag=true;
  //-------------------------------------
  while (Flag==true)
  {
    if (LineFind()==true)
    {
      LineSens();
      Inform();
    } else
    {
      Flag=false;
    }
  }
  //-------------------------------------
}
//========================================================================

//========================================================================
void LineDraw()
{
  //-------------------------------------
  double ask;
  double bid;
  double point;
  //-------------------------------------
  string Symb=Symbol();
  ask        =MarketInfo(Symb,MODE_ASK);
  bid        =MarketInfo(Symb,MODE_BID);
  point      =MarketInfo(Symb,MODE_POINT);
  //-------------------------------------
  StopLoss   =SLdefault*point;                             //Íîðìàëèçîâàíî. Àáñîëþòíàÿ âåëè÷èíà ðàññòîÿíèÿ îò SL äî ask/bid
  SLline     =bid-StopLoss;                                //Íîðìàëèçîâàíî. Öåíîâîå çíà÷åíèå óðîâíÿ ñòîïà
  TakeProfit =NormalizeDouble(StopLoss*ProfitRatio,Digits);//Íîðìàëèçîâàíî. Àáñîëþòíàÿ âåëè÷èíà ðàññòîÿíèÿ îò TP äî ask/bid
  TPline     =ask+TakeProfit;                              //Íîðìàëèçîâàíî. Öåíîâîå çíà÷åíèå óðîâíÿ ïðîôèòà
  //-------------------------------------
  //Ñîçäàäèì ëèíèþ TP
  ObjectCreate("SignalLineTP", OBJ_HLINE, 0,  0,TPline);
  ObjectSet   ("SignalLineTP", OBJPROP_COLOR, Blue);
  //Ñîçäàäèì ëèíèþ SL
  ObjectCreate("SignalLineSL", OBJ_HLINE, 0,  0,SLline);
  ObjectSet   ("SignalLineSL", OBJPROP_COLOR, Red);
  //-------------------------------------
}
//========================================================================

//========================================================================
void LineSens()
{
  //-------------------------------------
  RefreshRates();
  string Symb      = Symbol();
  double stoplevel = MarketInfo(Symb,MODE_STOPLEVEL)*Point;//Àáñîëþòíûé ðàçìåð â ïóíêòàõ
  double CurrentValue;
  //-------------------------------------
  //Îïðåäåëèì, Buy èëè Sell ïîçèöèÿ
  CurrentValue       =NormalizeDouble(ObjectGet("SignalLineSL", OBJPROP_PRICE1),Digits);//Íîðìàëèçîâàííîå öåíîâîå çíà÷åíèå óðîâíÿ SL 

  //Åñëè ëèíèÿ ñòîïà íèæå ñåðåäèíû ìåæäó Ask è Bid òî...
  if (CurrentValue<(Ask+Bid)*0.5)
  {//...èìååì äåëî ñ äëèííîé ïîçèöèåé----------
    if (Bid-CurrentValue<stoplevel)
    {
      CurrentValue=Bid-stoplevel;
    }
    //Îáðàáîòàåì ëèíèþ ñòîïà
    UsersOrderType="Buy";
    ObjectMove("SignalLineSL",0,1, CurrentValue);//Ïåðåäâèíåì SL íà íîðìàëèçîâàííîå çíà÷åíèå óðîâíÿ SL
    SLline     =CurrentValue;                    //Íîðìàëèçîâàíî. Öåíîâîå çíà÷åíèå óðîâíÿ ñòîïà
    StopLoss   =Bid-SLline;                      //Íîðìàëèçîâàíî. Àáñîëþòíàÿ âåëè÷èíà ðàññòîÿíèÿ îò SL äî ask/bid
    SL         =StopLoss/Point;                  //Îòíîñèòåëüíûé ðàçìåð SL â ïóíêòàõ

    //Îáðàáîòàåì ëèíèþ ïðîôèòà
    TakeProfit =NormalizeDouble(StopLoss*ProfitRatio,Digits);//Íîðìàëèçîâàíî. Àáñîëþòíàÿ âåëè÷èíà ðàññòîÿíèÿ îò TP äî ask/bid
    TP         =TakeProfit/Point;                            //Îòíîñèòåëüíûé ðàçìåð TP â ïóíêòàõ
    TPline     =Ask+TakeProfit;                              //Íîðìàëèçîâàíî. Öåíîâîå çíà÷åíèå óðîâíÿ ïðîôèòà
    ObjectMove("SignalLineTP",0,1, TPline);                  //Ïåðåäâèíåì TP íà íîðìàëèçîâàííîå çíà÷åíèå óðîâíÿ TP
    //------------------------------------------
  }
  //----------------------------------------------------------
  else
  {//...èìååì äåëî ñ êîðîòêîé ïîçèöèåé---------
    if (CurrentValue-Ask<stoplevel)
    {
      CurrentValue=Ask+stoplevel;
    }
    //Îáðàáîòàåì ëèíèþ ñòîïà
    UsersOrderType="Sell";
    ObjectMove("SignalLineSL",0,1, CurrentValue);//Ïåðåäâèíåì SL íà íîðìàëèçîâàííîå çíà÷åíèå óðîâíÿ SL
    SLline     =CurrentValue;                    //Íîðìàëèçîâàíî. Öåíîâîå çíà÷åíèå óðîâíÿ ñòîïà
    StopLoss   =SLline-Ask;                      //Íîðìàëèçîâàíî. Àáñîëþòíàÿ âåëè÷èíà ðàññòîÿíèÿ îò SL äî ask/bid
    SL         =StopLoss/Point;                  //Îòíîñèòåëüíûé ðàçìåð SL â ïóíêòàõ

    //Îáðàáîòàåì ëèíèþ ïðîôèòà
    TakeProfit =NormalizeDouble(StopLoss*ProfitRatio,Digits);//Íîðìàëèçîâàíî. Àáñîëþòíàÿ âåëè÷èíà ðàññòîÿíèÿ îò TP äî ask/bid
    TP         =TakeProfit/Point;                            //Îòíîñèòåëüíûé ðàçìåð TP â ïóíêòàõ
    TPline     =Bid-TakeProfit;                              //Íîðìàëèçîâàíî. Öåíîâîå çíà÷åíèå óðîâíÿ ïðîôèòà
    ObjectMove("SignalLineTP",0,1, TPline);                  //Ïåðåäâèíåì TP íà íîðìàëèçîâàííîå çíà÷åíèå óðîâíÿ TP
    //------------------------------------------
  }
  //-------------------------------------
  WindowRedraw();
}
//========================================================================

//========================================================================
bool LineFind()
{
  //-------------------------------------
  if (ObjectFind("SignalLineTP")==-1)
  {
    return(false);
  } else
  {
    return(true);
  }
  //-------------------------------------
}
//========================================================================

//========================================================================
void OpenOrder()
{
  //-------------------------------------
  int    
  Ticket,    // Íîìåð îðäåðà
  MN;        // MagicNumber
  bool Modify=false;
  //-------------------------------------
  Lot();

  if (UsersOrderType=="Buy") // Áóäåì îòêðûâàòü Buy
  {
    Ticket=OrderSend(Symbol(),0,Lots_New,Ask,2,0.0,0.0,"",MN);
    if (Ticket==-1)
      Print("Íå óäàëîñü èñïîëíèòü ðûíî÷íûé îðäåð, îøèáêà - ",GetLastError());
    else
    {
      OrderSelect(Ticket, SELECT_BY_TICKET) ;
      Modify=OrderModify(Ticket,OrderOpenPrice(),SLline,TPline,0,Blue);
      if (Modify==true)
        Print("Íå óäàëîñü óñòàíîâèòü SL è TP îðäåðà. Âíèìàíèå!!! Îðäåð áåç çàùèòíûõ ñòîïîâ! Îøèáêà - ",GetLastError());
    }
  }
  if (UsersOrderType=="Sell") // Áóäåì îòêðûâàòü Sell
  {

    Ticket=OrderSend(Symbol(),1,Lots_New,Bid,2,0.0,0.0,"",MN);
    if (Ticket==-1)
      Print("Íå óäàëîñü èñïîëíèòü ðûíî÷íûé îðäåð, îøèáêà - ",GetLastError());
    else
    {
      OrderSelect(Ticket, SELECT_BY_TICKET) ;
      Modify=OrderModify(Ticket,OrderOpenPrice(),SLline,TPline,0,Red);
      if (Modify==true)
        Print("Íå óäàëîñü óñòàíîâèòü SL è TP îðäåðà. Âíèìàíèå!!! Îðäåð áåç çàùèòíûõ ñòîïîâ! Îøèáêà - ",GetLastError());
    }
  }
  //-------------------------------------
  Comment("Îòêðîåì ïîçèöèþ "+ UsersOrderType+" ñ StopLoss=", SLline," TakeProfit=", TPline," Ðàçìåð ëîòà=",Lots_New);
  //-------------------------------------
  return;
}
//========================================================================

//========================================================================
void Lot()
{
  //-------------------------------------
  string Symb    =Symbol();                            // Ôèíàíñîâûé èíñòðóì.
  double One_Lot =MarketInfo(Symb,MODE_MARGINREQUIRED);//Ðàçìåð ñâîáîäíûõ ñðåäñòâ, íåîáõîäèìûõ äëÿ îòêðûòèÿ 1 ëîòà
  double Min_Lot =MarketInfo(Symb,MODE_MINLOT);        //Ìèí. ðàçìåð. ëîòà
  double Step    =MarketInfo(Symb,MODE_LOTSTEP);       //Øàã èçìåíåí ðàçìåðà ëîòà
  double Free    =AccountFreeMargin();                 //Ñâîáîäíûå ñðåäñòâà
  double LotPrice=MarketInfo(Symb, MODE_TICKVALUE);    //Ñòîèìîñòü 1 ëîòà â âàëþòå äåïî íà 1 òèê
  //-------------------------------------
  if (OrdersHistoryTotal()<1)
  {
    Loss_Prev=MinLoss;
    Lots_New=NormalizeDouble(Loss_Prev/(LotPrice*SL),2);
  } else
  {
    OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS, MODE_HISTORY);
    if (OrderProfit()<0)
    {
      Loss_Prev*=K_Martin;
      Lots_New=NormalizeDouble(Loss_Prev/(LotPrice*SL),2);
    } else
    {
      Loss_Prev=MinLoss;
      Lots_New=NormalizeDouble(Loss_Prev/(LotPrice*SL),2);
    }
  }
  //-------------------------------------
}
//========================================================================

//========================================================================
double LotInfo()
{
  //-------------------------------------
  string Symb    =Symbol();                            // Ôèíàíñîâûé èíñòðóì.
  double One_Lot =MarketInfo(Symb,MODE_MARGINREQUIRED);//Ðàçìåð ñâîáîäíûõ ñðåäñòâ, íåîáõîäèìûõ äëÿ îòêðûòèÿ 1 ëîòà
  double Min_Lot =MarketInfo(Symb,MODE_MINLOT);        //Ìèí. ðàçìåð. ëîòà
  double Step    =MarketInfo(Symb,MODE_LOTSTEP);       //Øàã èçìåíåí ðàçìåðà ëîòà
  double Free    =AccountFreeMargin();                 //Ñâîáîäíûå ñðåäñòâà
  double LotPrice=MarketInfo(Symb, MODE_TICKVALUE);    //Ñòîèìîñòü 1 ëîòà â âàëþòå äåïî íà 1 òèê

  double LossPrevTemp;
  double LotsNewTemp;
  //-------------------------------------
  if (OrdersHistoryTotal()<1)
  {
    LossPrevTemp=MinLoss;
    LotsNewTemp=NormalizeDouble(LossPrevTemp/(LotPrice*SL),2);
  } else
  {
    OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS, MODE_HISTORY);
    if (OrderProfit()<0)
    {
      LossPrevTemp=Loss_Prev*K_Martin;
      LotsNewTemp=NormalizeDouble(LossPrevTemp/(LotPrice*SL),2);
    } else
    {
      LossPrevTemp=MinLoss;
      LotsNewTemp=NormalizeDouble(LossPrevTemp/(LotPrice*SL),2);
    }
  }
  //-------------------------------------
  return(LotsNewTemp);
}
//========================================================================

//========================================================================
void Inform()
{
  //-------------------------------------
  string Symb              = Symbol();
  string DepoCurrency      = AccountCurrency();                         //Íàèìåíîâàíèå âàëþòû äëÿ ñ÷åòà
  double MeansOneLot       = MarketInfo(Symb,MODE_MARGINREQUIRED);      //Íåîáõîäèìî ñðåäñòâ äëÿ îòêðûòèÿ 1 ëîòà
  double MeansFree         = AccountFreeMargin();                       //Çíà÷åíèå ñâîáîäíûõ ñðåäñòâ, ðàçðåøåííûõ äëÿ îòêðûòèÿ ïîçèöèé
  double MeansGuaranty     = AccountMargin();                           //Çíà÷åíèå çàëîãîâûõ ñðåäñòâ, èñïîëüçóåìûõ äëÿ ïîääåðæàíèÿ îòêðûòûõ ïîçèöèé
  double LotPriceTic       = MarketInfo(Symb, MODE_TICKVALUE);          //Ñòîèìîñòü 1 ëîòà â âàëþòå äåïî íà 1 òèê
  double MaxLotPermissible = MathFloor((MeansFree/MeansOneLot)*100)/100;//Ìàêñèìàëüíî äîïóñòèìûé ëîò äëÿ îòêðûòèÿ ïîçèöèè
  double MaxSLPermissible;                                              //Ìàêñèìàëüíî äîïóñòèìûé SL äî StopOut

  double stopout;
  string ind;
  //-------------------------------------
  if (AccountStopoutMode()==0)
  {
    stopout=AccountStopoutLevel();
    ind    ="%";
    MaxSLPermissible  = MathFloor((MeansFree*(100-stopout))/(LotPriceTic*LotInfo()*100));
  } else
  {
    stopout=AccountStopoutLevel();
    ind    =DepoCurrency;
    //MaxSLPermissible  = MathFloor( (MeansFree-stopout)/(LotPriceTic*LotInfo()) );
  }
  //-------------------------------------   
  Comment(
         "SLline = ",SLline
         ,"\n",
         "TPline = ",TPline
         ,"\n",
         "TP     = ",TP
         ,"\n",
         "SL     = ",SL//,"  MaxSL=",MaxSLPermissible
         ,"\n",
         "Lot    =",LotInfo(),"  MaxLot=",MaxLotPermissible
         ,"\n",
         "Profit =",LotPriceTic*LotInfo()*TP,"  Loss=",LotPriceTic*LotInfo()*SL
         ,"\n",
         "Óðîâåíü ñòîïëåâåëà = ",MarketInfo(Symb,MODE_STOPLEVEL)
         ,"\n",
         "Ñïðåä = ",MarketInfo(Symb,MODE_SPREAD)
         );
}
//========================================================================

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