TPEHEP_MM
Download scriptThis 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.
//+------------------------------------------------------------------+
//| 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