TPEHEP_MM

This tool is a sophisticated strategy testing and manual simulation environment designed for traders who want to "replay" market history step-by-step. It allows you to visually simulate trading scenarios, manage risk in real-time, and generate professional reports without actually risking live capital during the testing phase.

Core Functionality

The script acts as an interactive playground where you can move through historical price data bar by bar. Instead of a standard "fast-forward" backtest, it provides a controlled environment where you can manually trigger trades, observe how price actions interact with your set levels, and see the immediate impact on your virtual balance.

Key Logic Components

1. Manual Trade Execution & Interaction The script is primarily controlled via keyboard shortcuts:

  • Buy/Sell Commands: You can initiate "Buy" or "Sell" positions at specific points in history. The tool then automatically draws the corresponding entry lines and visual markers on your chart.
  • Manual Closing: You have the option to manually close a trade at any time, which triggers an immediate calculation of the profit or loss based on the current price relative to your entry point.
  • Visual Navigation: It includes custom navigation controls (arrows) to move forward and backward through history, along with a "Step" function to jump through the data more efficiently.

2. Dynamic Visual Feedback As you navigate the chart, the script provides real-time visual updates:

  • Dynamic Zones: It highlights the specific area of interest based on your Stop Loss settings.
  • Live Dashboard: A dynamic text display on the chart shows your current Lot size, unrealized Profit/Loss, and total Equity as you move through the bars.
  • Trade Pathing: When a trade is closed, the script draws a dotted line connecting the entry point to the exit point, color-coded by whether the result was a win (blue) or a loss (red).

3. Intelligent Risk & Order Management The logic includes several "safety" and calculation features:

  • Smart Lot Sizing: It calculates your trade size based on your account balance and your desired risk percentage. It also ensures that the calculated size stays within the broker's minimum and maximum limits.
  • Freeze Levels: The tool recognizes "Freeze Levels." If a price gets too close to your Stop Loss or Take Profit, the script can prevent you from moving those lines into an invalid zone, mimicking real-market restrictions.
  • Automated Exit Detection: The logic constantly monitors the high and low prices of each bar. If the price hits your predefined Take Profit or Stop Loss levels, the tool automatically "triggers" the exit, logs the result, and clears the markers.

4. Data Logging & Reporting Perhaps the most professional aspect of this script is its reporting capability:

  • Excel Compatibility: Every action—entry price, exit time, trade type, lot size, profit/loss, and resulting equity—is recorded into a structured file format compatible with Excel.
  • Template Saving: You can save your entire chart layout as a template at any time to preserve your specific visual configurations for future sessions.

Summary for the User

Think of this script as a "Flight Simulator" for traders. It takes historical market data and gives you the "controls" to fly through it. By using this, you can practice your reaction times, test different risk percentages, and build a comprehensive log of your strategy's performance before ever putting real money on the line.

Miscellaneous
It issuies visual alerts to the screenUses files from the file systemIt writes information to file
13 Views
0 Downloads
0 Favorites
TPEHEP_MM
//+------------------------------------------------------------------+
//|                                                    TPEHEP_MM.mq4 |
//|                                                   Copyright 2016.|
//+------------------------------------------------------------------+
#property link      "Fedor10_10@mail.ru"
#property version   "1.02"
#property strict
#property indicator_chart_window
#property description "Èíäèêàòîð TPEHEP_MM ïðåäíàçíà÷åí äëÿ òåñòèðîâàíèÿ ñòðàòåãèè"
#property description "íà èñòîðèè â ïîøàãîâîì ðåæèìå ñ àâòîìàòè÷åñêèì êîíòðîëåì"
#property description "èñïîëíåíèÿ ïðèêàçîâ, îøèáîê, è ñîçäàíèåì îò÷åòà äëÿ Excel."
#property description "  Ãîðÿ÷èå êëàâèøè:  'B'- BUY,  'S'- SELL,  'C'- CLOSE"
#property description "                                   F12 èëè Step- ñäâèã ãðàôèêà íà 1 øàã"
#property description "                                   '<'- Îáëàñòü âëåâî, '>'- Îáëàñòü âïðàâî"
#property description "                                   'P'- ñîõðàíåíèå ôàéëà îò÷åòà"
extern string K="+:+:+:+";     //Ïàðàìåòðû èñïîëíåíèÿ ïðèêàçîâ
input bool    Traid=true;      //Òîðãîâëÿ/Ðàçìåòêà
input double  Lots=0.01;       //Ëîò Ôèêñèðîâàííûé èëè Ìèíèìàëüíûé
extern double Risk=0.0;        //ÌÌ %Ðèñêà îò StopLoss. 0- Ôèêñèðîâàííûé Ëîò
input double  LotsMax=10.0;    //ìàêñèìàëüíûé Ëîò
extern double StopLoss=100.0;  //StopLoss (â 5-çíà÷íîì)
extern double TakeProfit=100.0;//TakeProfit (â 5-çíà÷íîì)
extern double Money=100.0;     //Íà÷àëüíûå ñðåäñòâà
extern double Spread=0.0;      //Ñïðåä (â 5-çíà÷íîì) 0 - èç èñòîðèè
extern double Freeze=0.0;      //Çàìîðîçêà (â 5-çíà÷íîì) 0 - èç èñòîðèè
extern string M="+:+:+:+";     //ðàçíîå
input bool    Color=true;      //ôîí áåëûé/÷åðíûé
input bool    Vertical=true;   //ðèñîâàíèå/íåò âåðòèêàëüíûõ ëèíèé
input bool    Alerts=false;    //çàïðåò ïðåäóïðåæäåíèé
input bool    Gluk=false;      //óñòðàíåíèå êîíôëèêòà ñ Exel
input int     Step=46;         //Êëàâèøà ñäâèãà ãðàôèêà íà 1 øàã
color  Zone,OpBUY,OpSELL,ClsAll,TakePr,StopLs;
int    tik,bar0,Ordr,Tr,SH,file;
double Ask0,Ask1,Bid0,Bid1,Lev,LevOrd,LevUp,LevDn,lott,MaxLot,MinLot;
string FileName,FileNamo,Namo,Uplev,Oplev,Dnlev;
long   result,resold;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Color)//ôîí áåëûé
     {
      Zone=clrSilver;      //öâåò âûäåëåíèÿ ðàññìàòðèâàåìîãî áàðà
      OpBUY=clrSteelBlue;  //öâåò ëèíèè BUY
      OpSELL=clrPlum;      //öâåò ëèíèè SELL
      ClsAll=clrDarkOrange;//öâåò ëèíèè çàêðûòèÿ ðó÷íîãî
      TakePr=clrLimeGreen; //öâåò ëèíèè çàêðûòèÿ ïî TakeProfit
      StopLs=clrYellow;    //öâåò ëèíèè çàêðûòèÿ ïî StopLoss
        }else{//ôîí ÷åðíûé
      Zone=clrDimGray;     //öâåò âûäåëåíèÿ ðàññìàòðèâàåìîãî áàðà
      OpBUY=clrLightSkyBlue;//öâåò ëèíèè BUY
      OpSELL=clrLightPink; //öâåò ëèíèè SELL
      ClsAll=clrKhaki;     //öâåò ëèíèè çàêðûòèÿ ðó÷íîãî
      TakePr=clrPaleGreen; //öâåò ëèíèè çàêðûòèÿ ïî TakeProfit
      StopLs=clrYellow;    //öâåò ëèíèè çàêðûòèÿ ïî StopLoss
     }
   FileName=Symbol()+"."+IntegerToString(Period())+" ";//âðåìåííûé ôàéë äëÿ çàïèñè ñäåëîê
   if(Traid)//ïðîïóñê ïðè îòêàçå îò ðàñ÷åòà
     {
      if(Spread==0.0) Spread=MarketInfo(Symbol(),MODE_SPREAD);//Ñïðåä
      if(Spread==0.0) Alert("Spread ","íå îïðåäåëåí");
      Spread=NormalizeDouble((Spread*Point),Digits);//ñïðåä
      if(Freeze==0.0) Freeze=MarketInfo(Symbol(),MODE_FREEZELEVEL);//óðîâåíü çàìîðîçêè
      if(Freeze==0.0) Alert("Óðîâåíü çàìîðîçêè ","íå îïðåäåëåí");
      Freeze=NormalizeDouble((Freeze*Point),Digits);//óðîâåíü çàìîðîçêè
      Lev=NormalizeDouble((MarketInfo(Symbol(),MODE_STOPLEVEL)*Point),Digits);//ìèíèìàëüíûé ñòîï
      if(Lev==0.0) Alert("STOPLEVEL ","íå îïðåäåëåí");
      else
        {
         if(StopLoss<Lev) {StopLoss=Lev; Alert("StopLoss=",StopLoss/Point);}
         if(TakeProfit<Lev) {TakeProfit=Lev; Alert("TakeProfit=",TakeProfit/Point);}
        }
      TakeProfit=NormalizeDouble((TakeProfit*Point),Digits);//TakeProfit
      StopLoss=NormalizeDouble((StopLoss*Point),Digits);//StopLoss
      Risk=(Risk/100)/(StopLoss/Point);//ïåðåâîä â êîýôôèöèåíò MM
      MinLot=NormalizeDouble((MarketInfo(Symbol(),MODE_MINLOT)),Digits);//ìèíèìàëüíûé ñòîï
      if(MinLot>0.0) MinLot=fmax(Lots,MinLot); else MinLot=Lots;
      MaxLot=NormalizeDouble((MarketInfo(Symbol(),MODE_MAXLOT)),Digits);//ìèíèìàëüíûé ñòîï
      if(MaxLot>0.0) MaxLot=fmin(LotsMax,MaxLot); else MaxLot=LotsMax;
      lott=Lot();
      Comment("Spread=",IntegerToString(int(Spread/Point)),"\n","Freeze=",IntegerToString(int(Freeze)),"\n",
              "StopLoss=",IntegerToString(int(StopLoss/Point)),"\n","TakeProfit=",
              IntegerToString(int(TakeProfit/Point)),"\n","MINLOT=",MinLot,"\n","MAXLOT=",MaxLot);
      ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,result);//êîëè÷åñòâî ïèêñåëåé ïî Õ
      ObjectCreate("Show1",OBJ_LABEL,0,0,0); //ìåñòî îòðèñîâêè íà ýêðàíå
      ObjectSet("Show1",OBJPROP_XDISTANCE,result/2-200);
      ObjectSet("Show1",OBJPROP_YDISTANCE,0);
      ObjectSet("Show1",OBJPROP_CORNER,0);
      ObjectSetText("Show1","ËÎÒ:          ÏÐÎÔÈÒ:               ÁÀËÀÍÑ:               ",14,"Arial",clrDarkGray);//íàäïèñü
      ObjectCreate("Show2",OBJ_LABEL,0,0,0); //ìåñòî îòðèñîâêè íà ýêðàíå
      ObjectSet("Show2",OBJPROP_XDISTANCE,result/2-155);
      ObjectSet("Show2",OBJPROP_YDISTANCE,0);
      ObjectSet("Show2",OBJPROP_CORNER,0);
      ObjectSetText("Show2",DoubleToString(lott,2),14,"Arial",clrBlueViolet);//ËÎÒ
      ObjectCreate("Show3",OBJ_LABEL,0,0,0); //ìåñòî îòðèñîâêè íà ýêðàíå
      ObjectSet("Show3",OBJPROP_XDISTANCE,result/2-15);
      ObjectSet("Show3",OBJPROP_YDISTANCE,0);
      ObjectSet("Show3",OBJPROP_CORNER,0);
      ObjectSetText("Show3",DoubleToString(0.0,2),14,"Arial",clrBlueViolet);//ÏÐÎÔÈÒ
      ObjectCreate("Show4",OBJ_LABEL,0,0,0); //ìåñòî îòðèñîâêè íà ýêðàíå
      ObjectSet("Show4",OBJPROP_XDISTANCE,result/2+140);
      ObjectSet("Show4",OBJPROP_YDISTANCE,0);
      ObjectSet("Show4",OBJPROP_CORNER,0);
      ObjectSetText("Show4",DoubleToString(Money,2),14,"Arial",clrBlueViolet);//ÁÀËÀÍÑ
      resold=result;
      file=FileOpen(FileName,FILE_WRITE|FILE_SHARE_READ|FILE_TXT);
      FileWrite(file,"  Ticket\tOpnDate\tOpnTime\t    Type\t    Size\t   Item\t  Price\tClsDate\tClsTime\t  Price\tTradeP/L\t  Equity");
     }
   ObjectCreate("Zona",OBJ_TREND,0,Time[0],(Close[0]-StopLoss),Time[0],(Close[0]+StopLoss));//âûäåëÿåì îáëàñòü ðàññìàòðèâàåìîãî áàðà
   ObjectSet("Zona",OBJPROP_STYLE,DRAW_LINE);
   ObjectSet("Zona",OBJPROP_WIDTH,8);
   ObjectSet("Zona",OBJPROP_COLOR,Zone);
   ObjectSet("Zona",OBJPROP_BACK,true);
   ObjectSet("Zona",OBJPROP_RAY_RIGHT,false);
   ObjectSet("Zona",OBJPROP_TIME1,Time[0]);//óòî÷íèì
   ObjectSet("Zona",OBJPROP_PRICE1,(Close[0]-StopLoss));//óòî÷íèì
   ObjectSet("Zona",OBJPROP_TIME2,Time[0]);//óòî÷íèì
   ObjectSet("Zona",OBJPROP_PRICE2,(Close[0]+StopLoss));//óòî÷íèì
   ChartRedraw(); //ïåðåðèñóåì
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(Traid) FileClose(file);//ñîõðàíåíèå ïîñëå ðàñ÷åòà
   ObjectDel();
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   return(rates_total);//ïóñòûøêà
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,         // èäåíòèôèêàòîð ñîáûòèÿ
                  const long& lparam,   // ïàðàìåòð ñîáûòèÿ òèïà long
                  const double& dparam, // ïàðàìåòð ñîáûòèÿ òèïà double
                  const string& sparam) // ïàðàìåòð ñîáûòèÿ òèïà string
  {
//+------------------------------------------------------------------+
//| ïðîâåðêà íàæàòèÿ êëàâèøè èëè ìûøêè                               |
//+------------------------------------------------------------------+
   if(CHARTEVENT_CHART_CHANGE)
     {
      ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0,result);//êîíòðîëü çà ðàçìåðîì ýêðàíà
      if(result!=resold) Show(result);
     }
   if(Traid && Ordr!=0)
     {
      if(id==CHARTEVENT_OBJECT_DRAG)
        {
         if(sparam==Uplev)//ïðîâåðêà âåðõíåãî óðîâíÿ
            if(LevUp!=ObjectGet(Uplev,OBJPROP_PRICE1))
               LevUp=MouseUp();//ïðè èçìåíåíèè óðîâíÿ
         if(sparam==Dnlev)//ïðîâåðêà íèæíåãî óðîâíÿ
            if(LevDn!=ObjectGet(Dnlev,OBJPROP_PRICE1))
               LevDn=MouseDn();//ïðè èçìåíåíèè óðîâíÿ
        }
     }
   if(id==CHARTEVENT_KEYDOWN)
     {
      switch(int(lparam))
        {
         case 37: Alert("Ïîïûòêà ïîâòîðèòü èñòîðèþ"); break;//KEY_LEFT_ARROW
         case 39: Alert("Ïîøàãîâàÿ ïðîêðóòêà ïî F12"); break;//KEY_RIGHT_ARROW ïî F12
         case 66: if(Traid)
           {
            if(Ordr==0)//KEY_BUY
              {
               Ordr=bar0;
               Levl("BUY");//ðèñóåì ëèíèè îòêðûòèÿ è ñòîïû
               if(Vertical) Vert("BUY",OpBUY);//ðèñóåì âåðòèêàëüíóþ ëèíèþ BUY
              }
            else Alert("Ñäåëêà óæå îòêðûòà");
           }
         else if(Tr!=1){Tr=1; Vert("BUY",OpBUY);}//ðèñóåì âåðòèêàëüíóþ ëèíèþ BUY
         else Alert("Òðåíä ââåðõ óæå îòìå÷åí");
         tik++; if(tik==1) {Namo=TimeToString(Time[Bar()],TIME_DATE); Comment("");}
         break;
         case 67: if(Traid)
           {
            if(Ordr!=0)//KEY_CLOSE
              {
               if(Freez()) break;//ïðîâåðêà íà çàìîðîçêó
               if(Vertical) Vert("CL",ClsAll);//ðèñóåì âåðòèêàëüíóþ ëèíèþ Clîså
               Profit("CL",Ordr);//ïîäñ÷èòàåì èòîã
               Ordr=0; if(Traid) Delet();//óäàëåíèå óðîâíåé
              }
            else Alert("Íåò ñäåëêè");
           }
         else if(Tr!=0) {Tr=0; Vert("CL",ClsAll);}//ðèñóåì âåðòèêàëüíóþ ëèíèþ Clîså
         else Alert("Òðåíä íå îòìå÷åí");
         break;
         case 80:
            if(tik<1)//÷èñòûé øàáëîí
              {
               ObjectsDeleteAll();  Comment("");
               if(ChartSaveTemplate(0,FileName+"."))
                  Alert("øàáëîí ",FileName," ñîõðàíåí"); break;
              }
            else
              {
               ObjectDel();
               FileNamo=FileName+Namo+"-"+TimeToString(Time[Bar()],TIME_DATE);
               if(Traid)//ñîõðàíåíèå ôàéëà îò÷åòà
                 {
                  FileFlush(file); FileClose(file);
                  if(FileMove(FileName,0,FileNamo+".xls",FILE_REWRITE))
                     Alert("îò÷åò ",FileNamo," ñîõðàíåí");
                  if(ChartSaveTemplate(0,FileNamo+"."))//øàáëîí ñ ðàçìåòêîé
                     Alert("ðàçìåòêà ",FileNamo," ñîõðàíåíà"); break;
                 }
               else//øàáëîí ñ ðàçìåòêîé
                 {
                  if(ChartSaveTemplate(0,FileNamo+"."))
                     Alert("ðàçìåòêà ",FileNamo," ñîõðàíåíà"); break;
                 }
              }
         case 83: if(Traid)
           {
            if(Ordr==0)//KEY_SELL
              {
               Ordr=-bar0;
               Levl("SEL");//ðèñóåì ëèíèè îòêðûòèÿ è ñòîïû
               if(Vertical) Vert("SEL",OpSELL);//ðèñóåì âåðòèêàëüíóþ ëèíèþ SELL
              }
            else Alert("Ñäåëêà óæå îòêðûòà");
           }
         else if(Tr!=-1) {Tr=-1; Vert("SEL",OpSELL);}//ðèñóåì âåðòèêàëüíóþ ëèíèþ SELL
         else Alert("Òðåíä âíèç óæå îòìå÷åí");
         tik++; if(tik==1) {Namo=TimeToString(Time[Bar()],TIME_DATE); Comment("");}
         break;
         case 188: SH++;//KEY_LEFT
         if(SH>WindowBarsPerChart()){Alert("Îáëàñòü íà ãðàíèöå ñëåâà"); SH=WindowBarsPerChart();}
         break;//óâåëè÷èì íîìåð ðàññìàòðèâàåìîãî áàðà
         case 190: SH--;//KEY_RIGHT
         if(SH<0){Alert("Îáëàñòü íà ãðàíèöå ñïðàâà"); SH=0;}
         break;//óìåíüøèì íîìåð ðàññìàòðèâàåìîãî áàðà 
         default: if(lparam==Step) {ChartNavigate(0,CHART_CURRENT_POS,1); break;}//KEY_Shift
         else Alert("Íàæàòà íå òà êëàâèøà",(lparam));
        }
     }
   if(Bar()<=0) {if(tik>0) Alert("Ïðîðèñîâàí ïîñëåäíèé áàð"); return;}//êîíòðîëü îêîí÷àíèÿ èñòîðèè
   bar0=Bar()+SH;//íîìåð íóæíîãî áàðà íà ãðàôèêå
   if(Time[bar0]!=ObjectGet("Zona",OBJPROP_TIME1))//ïðîâåðèì ðàññìàòðèâàåìûé áàð
     {
      Bid0=Close[bar0]; Ask0=Close[bar0]+Spread;//öåíà çàêðûòèÿ ðàññìàòðèâàåìîãî áàðà
      Bid1=Open[bar0-1]; Ask1=Open[bar0-1]+Spread;//öåíà îòêðûòèÿ áóäóùåãî áàðà
      LevStop();//ïðîâåðêà àâòîìàòè÷åñêîãî ñðàáàòûâàíèÿ óðîâíåé 
      Prof();//ïðîâåðêà ñðåäñòâ
      ObjectSet("Zona",OBJPROP_TIME1,Time[bar0]);//èçìåíåíèå ïðèâÿçêè ðàññìàòðèâàåìîãî áàðà
      ObjectSet("Zona",OBJPROP_PRICE1,(Close[bar0]-StopLoss+Spread));//èçìåíåíèå íèæíåãî óðîâíÿ ðàññìàòðèâàåìîãî áàðà
      ObjectSet("Zona",OBJPROP_TIME2,Time[bar0]);//èçìåíåíèå ïðèâÿçêè ðàññìàòðèâàåìîãî áàðà
      ObjectSet("Zona",OBJPROP_PRICE2,(Close[bar0]+StopLoss-Spread));//èçìåíåíèå âåðõíåãî óðîâíÿ ðàññìàòðèâàåìîãî áàðà
      ChartRedraw();//ïåðåðèñóåì
     }
  }
//+------------------------------------------------------------------+
//| ïðèëîæåíèÿ                                                       |
//+------------------------------------------------------------------+
void LevStop()//ïðîâåðêà àâòîìàòè÷åñêîãî ñðàáàòûâàíèÿ ïðèêàçîâ
  {
   if(Ordr>0)//êîíòðîëü BUY
     {
      if(Low[bar0]<=LevDn)//ïðè ïðîáèòèè íèæíåãî óðîâíÿ
        {
         if(Vertical) Vert("SL",StopLs);
         if(Traid) {Profit("SL",Ordr); Delet();}
         if(Alerts) Alert("Ñðàáîòàë StopLoss");
         Ordr=0;
        }
      if(High[bar0]>=LevUp)//ïðè ïðîáèòèè âåðõíåãî óðîâíÿ
        {
         if(Vertical) Vert("TP",TakePr);
         if(Traid) {Profit("TP",Ordr); Delet();}
         if(Alerts) Alert("ñðàáîòàë TakeProfit");
         Ordr=0;
        }
     }
   if(Ordr<0)//êîíòðîëü SELL
     {
      if(High[bar0]+Spread>=LevUp)//ïðè ïðîáèòèè âåðõíåãî óðîâíÿ
        {
         if(Vertical) Vert("SL",StopLs);
         if(Traid) {Profit("SL",Ordr); Delet();}
         if(Alerts) Alert("Ñðàáîòàë StopLoss");
         Ordr=0;
        }
      if(Low[bar0]+Spread<=LevDn)//ïðè ïðîáèòèè íèæíåãî óðîâíÿ
        {
         if(Vertical) Vert("TP",TakePr);
         if(Traid) {Profit("TP",Ordr); Delet();}
         if(Alerts) Alert("ñðàáîòàë TakeProfit");
         Ordr=0;
        }
     }
  }
//+------------------------------------------------------------------+
double Lot()//MoneyManagement
  {
   if(Risk>0.0)
     {
      double LotResult=Money*Risk;//ðàñ÷åò ëîòà
      LotResult=fmax(LotResult,MinLot);//íå ìåíüøå
      LotResult=fmin(LotResult,MaxLot);//è íå áîëüøå
      return(LotResult);//×òî ïîëó÷èëîñü
     }
   else return(MinLot);
  }
//+------------------------------------------------------------------+
void Profit(string cmd,int ord)//áóõãàëòåðèÿ
  {
   if(ord>0)//áûë BUY   Bid-Ask
     {
      if(cmd=="CL") Write("CL_BUY",ord,Time[bar0-1],Bid1,NormalizeDouble(Bid1-LevOrd,Digits));//Man
      if(cmd=="SL") Write("SL_BUY",ord,Time[bar0],LevDn,NormalizeDouble(LevDn-LevOrd,Digits));//SL
      if(cmd=="TP") Write("TP_BUY",ord,Time[bar0],LevUp,NormalizeDouble(LevUp-LevOrd,Digits));//TP
     }
   if(ord<0)//áûë SELL  Ask-Bid
     {
      if(cmd=="CL") Write("CL_SEL",ord,Time[bar0-1],Ask1,NormalizeDouble(LevOrd-Ask1,Digits));//Man
      if(cmd=="SL") Write("SL_SEL",ord,Time[bar0],LevUp,NormalizeDouble(LevOrd-LevUp,Digits));//SL
      if(cmd=="TP") Write("TP_SEL",ord,Time[bar0],LevDn,NormalizeDouble(LevOrd-LevDn,Digits));//TP
     }
  }
//+------------------------------------------------------------------+
void Write(string cmd,int ord,datetime tm,double cls,double pip)//çàïèñü â ôàéë
  {
   Money+=NormalizeDouble(lott*(pip/Point),2);//îáùèé èòîã â öåíòàõ
   FileWrite(file,tik,"\t",Dat(TimeToStr(Time[fabs(ord)],TIME_DATE)),"\t",TimeToStr(Time[fabs(ord)],TIME_SECONDS),
             "\t",cmd,"\t",Rus(DoubleToString(lott,2)),"\t",Symbol(),"\t",Rus(DoubleToString(LevOrd,Digits)),
             "\t",Dat(TimeToStr(tm,TIME_DATE)),"\t",TimeToStr(tm,TIME_SECONDS),"\t",Rus(DoubleToString(cls,Digits)),
             "\t",Rus(DoubleToString(lott*(pip/Point),2)),"\t",Rus(DoubleToString(Money,2)));
   lott=Lot();//íîâûé ËÎÒ
   ObjectSetText("Show2",DoubleToString(lott,2),14,"Arial",clrBlueViolet);
   Trend(cmd,ord,pip); Metca(cmd,ord);//ðèñóåì ðåçóëüòàò
  }
//+------------------------------------------------------------------+
void Trend(string cmd,int ord,double pip)//ðèñóåì ëèíèþ îò îòêðûòèÿ äî çàêðûòèÿ
  {
   string name="Trl"+IntegerToString(tik);
   color clr=clrBlue; if(pip<0) clr=clrRed;
   if(cmd=="CL_BUY") Tr(name, ord,Bid1,Time[bar0-1],clr);//Man
   if(cmd=="SL_BUY") Tr(name, ord,LevDn,Time[bar0], clr);//SL
   if(cmd=="TP_BUY") Tr(name, ord,LevUp,Time[bar0], clr);//TP
   if(cmd=="CL_SEL") Tr(name,-ord,Ask1,Time[bar0-1],clr);//Man
   if(cmd=="SL_SEL") Tr(name,-ord,LevUp,Time[bar0], clr);//SL
   if(cmd=="TP_SEL") Tr(name,-ord,LevDn,Time[bar0], clr);//TP
  }
//+------------------------------------------------------------------+
void Tr(string cmd,int ord,double pr,datetime tm,color clr)//ðèñóåì ëèíèþ îò îòêðûòèÿ äî çàêðûòèÿ
  {
   ObjectCreate(cmd,OBJ_TREND,0,Time[ord-1],LevOrd,tm,pr);
   ObjectSetInteger(0,cmd,OBJPROP_RAY_RIGHT,false);//îòêëþ÷èì (false) îòîáðàæåíèå ëèíèè âïðàâî
   ObjectSet(cmd,OBJPROP_STYLE,STYLE_DOT);
   ObjectSet(cmd,OBJPROP_COLOR,clr);
   ChartRedraw();//ïåðåðèñóåì
  }
//+------------------------------------------------------------------+
void Metca(string cmd,int ord)//ðèñóåì öåíîâóþ ìåòêó
  {
   if(cmd=="CL_BUY")
     {
      Met("OP_BUY"+IntegerToString(tik),LevOrd+5*Point,Time[ord-1],OpBUY);//Open BUY
      Met("CL_BUY"+IntegerToString(tik),Bid1+5*Point,Time[bar0-1],ClsAll);//Man BUY
     }
   if(cmd=="SL_BUY")
     {
      Met("OP_BUY"+IntegerToString(tik),LevOrd+5*Point,Time[ord-1],OpBUY);//Open BUY
      Met("SL_BUY"+IntegerToString(tik),LevDn+5*Point,Time[bar0],StopLs);//SL BUY
     }
   if(cmd=="TP_BUY")
     {
      Met("OP_BUY"+IntegerToString(tik),LevOrd+5*Point,Time[ord-1],OpBUY);//Open BUY
      Met("TP_BUY"+IntegerToString(tik),LevUp+5*Point,Time[bar0],TakePr);//TP BUY
     }
   if(cmd=="CL_SEL")
     {
      Met("OP_SELL"+IntegerToString(tik),LevOrd+5*Point,Time[-ord-1],OpSELL);//Open SELL
      Met("CL_SELL"+IntegerToString(tik),Ask1+5*Point,Time[bar0-1],ClsAll);//Man SELL
     }
   if(cmd=="SL_SEL")
     {
      Met("OP_SELL"+IntegerToString(tik),LevOrd+5*Point,Time[-ord-1],OpSELL);//Open SELL
      Met("SL_SELL"+IntegerToString(tik),LevUp+5*Point,Time[bar0],StopLs);//SL SELL
     }
   if(cmd=="TP_SEL")
     {
      Met("OP_SELL"+IntegerToString(tik),LevOrd+5*Point,Time[-ord-1],OpSELL);//Open SELL
      Met("TP_SELL"+IntegerToString(tik),LevDn+5*Point,Time[bar0],TakePr);//TP SELL
     }
  }
//+------------------------------------------------------------------+
void Met(string cmd,double pr,datetime tm,color clr)//ðèñóåì öåíîâóþ ìåòêó
  {
   ObjectCreate(cmd,OBJ_ARROW_LEFT_PRICE,0,tm,pr);
   ObjectSet(cmd,OBJPROP_ARROWCODE,119);
   ObjectSet(cmd,OBJPROP_STYLE,STYLE_SOLID);
   ObjectSet(cmd,OBJPROP_COLOR,clr);
   ChartRedraw();//ïåðåðèñóåì
  }
//+------------------------------------------------------------------+
void Vert(string cmd,color clr)//ðèñóåì âåðòèêàëüíóþ ëèíèþ
  {
   cmd+=IntegerToString(tik);
   ObjectCreate(cmd,OBJ_VLINE,0,Time[bar0],0);
   ObjectSet(cmd,OBJPROP_STYLE,STYLE_DASH);
   ObjectSet(cmd,OBJPROP_COLOR,clr);
   ObjectSet(cmd,OBJPROP_BACK,true);
   ChartRedraw();//ïåðåðèñóåì
  }
//+------------------------------------------------------------------+
void Levl(string cmd)//ðèñóåì ãîðèçîíòàëüíûå ëèíèè ïðèêàçîâ
  {
   Oplev=cmd;
   if(cmd=="BUY")
     {
      LevOrd=Ask1;//óðîâåíü Ask îòêðûòèÿ
      Uplev="TakeProfit"; LevUp=LevOrd+TakeProfit;//óðîâåíü Bid StopLoss îò îòêðûòèÿ
      Dnlev="StopLoss"; LevDn=LevOrd-StopLoss;//óðîâåíü Bid TakeProfit îò îòêðûòèÿ
     }
   if(cmd=="SEL")
     {
      LevOrd=Bid1;//óðîâåíü Bid îòêðûòèÿ
      Uplev="StopLoss"; LevUp=LevOrd+StopLoss;//óðîâåíü Ask TakeProfit îò îòêðûòèÿ
      Dnlev="TakeProfit"; LevDn=LevOrd-TakeProfit;//óðîâåíü Ask StopLoss îò îòêðûòèÿ
     }
   ObjectCreate(Uplev,OBJ_HLINE,0,0,LevUp);
   ObjectSet(Uplev,OBJPROP_STYLE,STYLE_DASHDOT);
   ObjectSet(Uplev,OBJPROP_COLOR,clrOrangeRed);
   ObjectSetInteger(0,Uplev,OBJPROP_BACK,true);
   ObjectCreate(Oplev,OBJ_HLINE,0,0,LevOrd);
   ObjectSet(Oplev,OBJPROP_STYLE,STYLE_DASHDOT);
   ObjectSet(Oplev,OBJPROP_COLOR,clrLimeGreen);
   ObjectSetInteger(0,Oplev,OBJPROP_BACK,true);
   ObjectCreate(Dnlev,OBJ_HLINE,0,0,LevDn);
   ObjectSet(Dnlev,OBJPROP_STYLE,STYLE_DASHDOT);
   ObjectSet(Dnlev,OBJPROP_COLOR,clrOrangeRed);
   ObjectSetInteger(0,Dnlev,OBJPROP_BACK,true);
   ChartRedraw();//ïåðåðèñóåì
  }
//+------------------------------------------------------------------+
string Rus(string ru)//Ôóíêöèÿ çàìåíÿåò(.)íà(,)äëÿ ðóññêîé Excel
  {
   if(Gluk) StringReplace(ru,".",",");
   return ru;
  }
//+------------------------------------------------------------------+
string Dat(string dt)//Ôóíêöèÿ çàìåíÿåò(.)íà(,)äëÿ ðóññêîé Excel
  {
   if(Gluk) StringReplace(dt,"."," ");
   return dt;
  }
//+------------------------------------------------------------------+
void Prof()//ïðîðèñîâêà ïðîôèòà
  {
   double rezalt;
   if(Ordr>0)
     {
      rezalt=lott*(Bid1-LevOrd)/Point;//ïðè âîçìîæíîì çàêðûòèè ôèêñàöèÿ íà ýòîì óðîâíå
      if(Money+rezalt<0.0 || Money+lott*(Low[bar0]-LevOrd)/Point<0.0) End();//êîí÷èëèñü ñðåäñòâà
     }
   else if(Ordr<0)
     {
      rezalt=lott*(LevOrd-Ask1)/Point;//ïðè âîçìîæíîì çàêðûòèè ôèêñàöèÿ íà ýòîì óðîâíå
      if(Money+rezalt<0.0 || Money+lott*(LevOrd-High[bar0]+Spread)/Point<0.0) End();//êîí÷èëèñü ñðåäñòâà
     }
   else rezalt=0.0;
   color Cl=clrBlueViolet; if(rezalt<0.0) Cl=clrCrimson;//öâåò ÏÐÎÔÈÒÀ
   ObjectSetText("Show3",DoubleToString(rezalt,2),14,"Arial",Cl);//ÏÐÎÔÈÒ
   ObjectSetText("Show4",DoubleToString((Money+rezalt),2),14,"Arial",clrBlueViolet);//èçìåíåíèå ðåçóëüòàòà
  }
//+------------------------------------------------------------------+
bool Freez()//çàìîðîçêà
  {
   if(Ordr>0)
     {
      if(LevUp<=Bid0+Freeze)
        {
         Alert("TakeProfit â çîíå çàìîðîçêè");
         return(true);
        }
      if(LevDn>=Bid0-Freeze)
        {
         Alert("StopLoss â çîíå çàìîðîçêè");
         return(true);
        }
     }
   if(Ordr<0)
     {
      if(LevUp<=Ask0+Freeze)
        {
         Alert("StopLoss â çîíå çàìîðîçêè");
         return(true);
        }
      if(LevDn>=Ask0-Freeze)
        {
         Alert("TakeProfit â çîíå çàìîðîçêè");
         return(true);
        }
     }
   return(false);
  }
//+------------------------------------------------------------------+
int Bar()//íîìåð ïåðâîãî âèäèìîãî áàðà íà ãðàôèêå.
  {
   long res=0;// ïîäãîòîâèì ïåðåìåííóþ
   res+=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0,res);//çàïðîñèì íîìåð ëåâîãî áàðà 
   res-=WindowBarsPerChart()+1;//íàéäåì íîìåð ïðàâîãî áàðà
   return(int(res));//--- âåðíåì íîìåð íóæíîãî áàðà
  }
//+------------------------------------------------------------------+
void Delet()//ïðîâåðêà óðîâíåé
  {
   ObjectDelete(Uplev);//óäàëåíèå âåðõíåãî óðîâíÿ
   ObjectDelete(Oplev);//óäàëåíèå óðîâíÿ îòêðûòèÿ
   ObjectDelete(Dnlev);//óäàëåíèå íèæíåãî óðîâíÿ
   ChartRedraw();//ïåðåðèñóåì
  }
//+------------------------------------------------------------------+
double MouseUp()
  {
   if(Freez()) ObjectSet(Uplev,OBJPROP_PRICE1,LevUp);//âîçâðàùàåì ëèíèþ íà ñòàðîå ìåñòî
   else
     {
      if(Ordr>0 && ObjectGet(Uplev,OBJPROP_PRICE1)<=Ask0+Lev)//åñëè ëèíèÿ â çîíå ìèíèìóìà
        {
         Alert("TakeProfit= ",Lev,"+1");
         ObjectSet(Uplev,OBJPROP_PRICE1,(Ask0+Lev+Point));//îòâîäèì TakeProfit çà ìèíèìóì
        }
      if(Ordr<0 && ObjectGet(Uplev,OBJPROP_PRICE1)<=Bid0+Lev)//åñëè ëèíèÿ â çîíå ìèíèìóìà
        {
         Alert("StopLoss= ",Lev,"+1");
         ObjectSet(Uplev,OBJPROP_PRICE1,(Bid0+Lev+Point));//îòâîäèì StopLoss çà ìèíèìóì
        }
     }
// ObjectSetInteger(0,Uplev,OBJPROP_SELECTED,false);//çàêðîåì
   ChartRedraw();//ïåðåðèñóåì
   return(ObjectGet(Uplev,OBJPROP_PRICE1));//âîçâðàùàåì âåðõíèé âûñòàâëåííûé óðîâåíü
  }
//+------------------------------------------------------------------+
double MouseDn()
  {
   if(Freez()) ObjectSet(Dnlev,OBJPROP_PRICE1,LevDn);//âîçâðàùàåì ëèíèþ íà ñòàðîå ìåñòî
   else
     {
      if(Ordr>0 && ObjectGet(Dnlev,OBJPROP_PRICE1)>=Ask0-Lev)//åñëè ëèíèÿ â çîíå ìèíèìóìà
        {
         Alert("StopLoss= ",Lev,"+1");
         ObjectSet(Dnlev,OBJPROP_PRICE1,(Ask0-Lev-Point));//îòâîäèì StopLoss çà ìèíèìóì
        }
      if(Ordr<0 && ObjectGet(Dnlev,OBJPROP_PRICE1)>=Bid0-Lev)//åñëè ëèíèÿ â çîíå ìèíèìóìà
        {
         Alert("StopLoss= ",Lev,"+1");
         ObjectSet(Dnlev,OBJPROP_PRICE1,(Bid0-Lev-Point));//îòâîäèì TakeProfit çà ìèíèìóì
        }
     }
//ObjectSetInteger(0,Dnlev,OBJPROP_SELECTED,false);//çàêðîåì
   ChartRedraw();//ïåðåðèñóåì
   return(ObjectGet(Dnlev,OBJPROP_PRICE1));//âîçâðàùàåì íèæíèé âûñòàâëåííûé óðîâåíü
  }
//+------------------------------------------------------------------+
void Show(long res)//êîíòðîëü çà ðàçìåðîì ýêðàíà
  {
   ObjectSet("Show1",OBJPROP_XDISTANCE,res/2-200);
   ObjectSet("Show2",OBJPROP_XDISTANCE,res/2-155);
   ObjectSet("Show3",OBJPROP_XDISTANCE,res/2-15);
   ObjectSet("Show4",OBJPROP_XDISTANCE,res/2+140);
   ChartRedraw();//ïåðåðèñóåì
   resold=result;
  }
//+------------------------------------------------------------------+
void End()//êîíåö
  {
   ObjectDel();
   ObjectCreate("Show7",OBJ_LABEL,0,0,0); //ìåñòî îòðèñîâêè íà ýêðàíå
   ObjectSet("Show7",OBJPROP_XDISTANCE,result/2-275);
   ObjectSet("Show7",OBJPROP_YDISTANCE,350);
   ObjectSet("Show7",OBJPROP_CORNER,0);
   ObjectSetText("Show7","ÑÎÕÐÀÍÈÒÅ ÎÒ×ÅÒ (Ð)  È ÏÅÐÅÓÑÒÀÍÎÂÈÒÅ ÑÒÐÀÒÅÃÈÞ!",14,"Arial",clrDarkGray);//íàäïèñü GAME OVER
   ObjectCreate("Show8",OBJ_LABEL,0,0,0); //ìåñòî îòðèñîâêè íà ýêðàíå
   ObjectSet("Show8",OBJPROP_XDISTANCE,result/2-500);
   ObjectSet("Show8",OBJPROP_YDISTANCE,50);
   ObjectSet("Show8",OBJPROP_CORNER,0);
   ObjectSetText("Show8","GAME OVER",125,"Arial",clrBrown);//íàäïèñü GAME OVER
  }
//+------------------------------------------------------------------+
void ObjectDel()
  {
   ObjectDelete("Zona");
   ObjectDelete("Show1");
   ObjectDelete("Show2");
   ObjectDelete("Show3");
   ObjectDelete("Show4");
   ObjectDelete("Show5");
   ObjectDelete("Show6");
   ChartRedraw();//ïåðåðèñóåì
  }
//+------------------------------------------------------------------+

Comments