Files

1134 lines
82 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//+------------------------------------------------------------------+
//| ProjectName |
//| Copyright 2012, CompanyName |
//| http://www.companyname.net |
//+------------------------------------------------------------------+
#property strict
#include <Trade/Trade.mqh>
#include <Trade/OrderInfo.mqh>
#include <Trade/PositionInfo.mqh>
//--------------------------------------------------------------------
extern string o1=" ---------- ТРЕЙЛИНГ-СТОП -------------- ";
extern int Dist=200; //расстояние от цены
extern int TrailingStop = 40; //длина тралла (0 - без тралла)
extern int TSz = 10; //задержка трейлинга в пунктах
extern int tttimer=100; // тралл по таймеру в миллисекундах, если 0 - без тралла по таймеру
extern string o2=" ---------- СДВИГАНИЕ ОТЛОЖЕК ---------- ";
extern int Stoploss=555; //стоплосс, если 0 - то без него
extern int TimeModify=1; // Интервал сдвига отложек, сек
extern int Kor=50; //спокойный коридор, 0 - без него
extern string o3=" ---------- ЗАПУСК ПО ВРЕМЕНИ ---------- ";
extern datetime timeStart=D'15:29:50'; // Старт
extern datetime timeFinish=0; // Финиш (необязательно)
extern string o4=" ---------- РАЗНОЕ --------------------- ";
extern double Lot=0.01; // объем лота
extern bool tester=false; // режим тестинга
bool deal_opened=false;
bool error;
bool local_time_corrected=false;
bool need_move_B=false,need_move_S=false,need_move_R=false;
bool old_start_time=false;
bool pending_closed=false;
bool pendings_placed=false;
bool print_stats=false;
bool stats_empty=true,stats_empty_written=false;
bool stats_printed=false;
color color_profit,color_rivok;
color TLclr=Lime;
datetime time_otst;
datetime time5sec=TimeLocal();
datetime TTouched;
double K1,K2;
double lastOOP,lastOOP_S,lastOOP_B;
double Minute_cur=round(TimeCurrent()/60)*60;
double order_close_slippage_int;
double order_open_slippage_int;
double order_profit_dbl;
double order_profit_p_int;
double OSL,OOP,SL,lastSL;
double rivok0,rivok;
double SL0=0;
double Spread=SymbolInfoInteger(Symbol(),SYMBOL_SPREAD)*_Point;
long STOPLEVEL;
double TSsum=0;
int sign_order=0;
int slippage=250;
int oi=2,oi1=2;
int otstup_level,otstup_level1;
int otstup_right=5;
int otstup_up=30,otstup_up1=16;;
int otstup_up0=24,otstup_up01=30;
int font_size=14,font_size1=10,font_size_text_=16;
int ii=0, iit=0, iic=0, in_tick=1,in_timer=2;
long OT;
int otst=1;
int sign_slip;
int str_pos=0;
int tick_count=0;
int ttimer;
long chart_ID=ChartID();
long time_left,secs_left,mins_left,hours_left,days_left,mnths_left,yrs_left;
string hor_line_1="hor_line_1";
string hor_line_2="hor_line_2";
string order_close_slippage="order_close_slippage";
string order_open_slippage="order_open_slippage";
string order_profit_p="order_profit_p";
string order_profit="order_profit";
string Rect1="Rect1";
string server_time="server_time";
string tick_or_timer_str;
string time_curr="time_curr";
string time_gone_str;
string time_left_hms;
string time_left_str_text="time_left_str_text";
string TimeFinishEv="TimeFinishEv";
string TimeStartEv="TimeStartEv";
string vert_line_curr="vert_line_curr";
string vert_line_finish="vert_line_finish";
string vert_line_start="vert_line_start";
uint tral_start, otladka_start;
string sov_pars1_str,sov_pars2_str;
string stats_empty2str;
string time_left_strstr;
MqlTick last_tick;
double Ask, Bid;
string current_symbol=_Symbol;
ulong ticketN, dealN, zdealN, horderN;
CTrade *Trade;
CPositionInfo PositionInfo;
MqlDateTime dt_struct;
////////////////////////////+------------------------------------------------------------------+
////////////////////////////| НАЧАЛО ИНИЦИАЛИЗАЦИИ |
////////////////////////////+------------------------------------------------------------------+
int OnInit()
{
Print("============= Инициация советника ========== время: ",TimeCurrent()," ========");
Print("Spread = ",round(Spread/_Point));
Print("TimeLocal = ",TimeLocal(dt_struct));
Print("TimeCurrent = ",TimeCurrent());
if(tester)
{
timeStart=TimeCurrent()+5; // для тестера
timeFinish=TimeCurrent()+12*60*60;
}
//Print(AccountInfoInteger(ENUM_ACCOUNT_TRADE_MODE),"------------"); //if (AccountInfoString(ENUM_ACCOUNT_TRADE_MODE)==ENUM_ACCOUNT_TRADE_DEMO) Print("DEMOOOOOOOOOOOOO");
/* if(timeStart<=TimeCurrent())
{
old_start_time=true;
create_text("error timeStart<=TimeCurrent","Задано старое время, остановка.",Red);
timeFinish=TimeCurrent();
}*/
if(tttimer==0) ttimer=1000; else ttimer=tttimer;
EventSetMillisecondTimer(ttimer);
if(timeFinish<timeStart) timeFinish=timeStart+2*60;
Minute_cur=round(TimeCurrent()/60)*60;
Trade = new CTrade;
Trade.SetDeviationInPoints(slippage);
if(SymbolInfoTick(Symbol(),last_tick)) {Ask=last_tick.ask; Bid=last_tick.bid; }
create_event(TimeStartEv,timeStart,Black);
create_event(TimeFinishEv,timeFinish,Black);
create_event(time_curr,TimeCurrent(),MidnightBlue);
create_v_line(vert_line_start,timeStart,Blue,STYLE_DOT);
create_v_line(vert_line_finish,timeFinish,Blue,STYLE_DOT);
create_h_line(hor_line_1,Ask+Dist*_Point,DarkSlateGray,STYLE_DASH);
create_h_line(hor_line_2,Bid-Dist*_Point,DarkSlateGray,STYLE_DASH);
K1=Ask+Kor*_Point;
K2=Bid-Kor*_Point;
create_rect(Rect1,TimeCurrent()+60*5,K1,TimeCurrent()-60*5,K2,MidnightBlue);
oi=oi-2;
oi1=oi1-2;
create_text(server_time,"",White);
create_text(time_left_str_text,TimeLeftCount(),Lime);
if(Spread>=Stoploss*_Point && !Spread==0)
{
int oldSLch=Stoploss;
Stoploss=(int)round(Spread*1.25/_Point);
Print("Старый СЛ=",oldSLch," изменен на ",Stoploss);
}
StringConcatenate(sov_pars1_str,"Dist=",Dist,", TS=",TrailingStop,"+",TSz,", SL=",Stoploss,", TM=",TimeModify,"s, Kor=",Kor,", Lot=",Lot);
create_text1("sov_pars1",sov_pars1_str,DarkGray);
StringConcatenate(sov_pars2_str,"Begin ",timeStart,", Finish ",timeFinish,"");
create_text1("sov_pars2",sov_pars2_str,DarkGray);
oi--;
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
EventKillTimer();
if (tester) CloseSel();
}
////////////////////////////+------------------------------------------------------------------+
////////////////////////////| КОНЕЦ ИНИЦИАЛИЗАЦИИ |
////////////////////////////+------------------------------------------------------------------+
////////////////////////////+------------------------------------------------------------------+
////////////////////////////| НАЧАЛО ТИКА |
////////////////////////////+------------------------------------------------------------------+
void OnTick()
{
if(SymbolInfoTick(Symbol(),last_tick)) {Ask=last_tick.ask; Bid=last_tick.bid; }
/* Print("K1 = ",K1);
Print("K2 = ",K2);
Print("Ask = ",Ask);
Print("Bid = ",Bid);*/
if((TimeCurrent()>timeStart && TimeCurrent()<timeFinish))
{
STOPLEVEL=(SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL));
OSL=0;
OOP=0;
SL=0;
TRAILING(in_tick);
if(need_move_R)
{
need_move_B=true;
need_move_S=true;
}
//+------------------------------------------------------------------+
//| ТРАЛ |
//+------------------------------------------------------------------+
for(ii=0; ii<OrdersTotal(); ii++)
{
ticketN=OrderGetTicket(ii);
if(OrderSelect(ticketN))
{
if(OrderGetString(ORDER_SYMBOL)==current_symbol)
{
//+------------------------------------------------------------------+
//| ПЕРЕДВИЖКА ОТЛОЖЕК |
//+------------------------------------------------------------------+
if(!deal_opened)
{
if((TimeCurrent()>TTouched+TimeModify) && (need_move_B || need_move_S))
{
OT=OrderGetInteger(ORDER_TYPE);
if(OT==ORDER_TYPE_BUY_STOP)
{
if(Stoploss>=STOPLEVEL && Stoploss!=0) SL=NormalizeDouble(Ask+(Dist-Stoploss)*_Point,_Digits); else SL=0;
if(need_move_B)
{
otladka_start=GetTickCount();
if(Trade.OrderModify(ticketN,NormalizeDouble(Ask+Dist*_Point,_Digits),SL,ORDER_TIME_GTC,0,0))
{
Print("Buy stop передвинута на уровень ",Ask+Dist*_Point," за ",GetTickCount()-otladka_start," мс");
lastOOP_B=NormalizeDouble(Ask+Dist*_Point,_Digits);
need_move_B=false;
MoveRect();
// rivok0=(Ask+Bid)/2;
}
}
}
if(OT==ORDER_TYPE_SELL_STOP)
{
if(Stoploss>=STOPLEVEL && Stoploss!=0) SL=NormalizeDouble(Bid-(Dist-Stoploss)*_Point,_Digits); else SL=0;
if(need_move_S)
{
otladka_start=GetTickCount();
if(Trade.OrderModify(ticketN,NormalizeDouble(Bid-Dist*_Point,_Digits),SL,ORDER_TIME_GTC,0,0))
{
Print("Sell stop передвинута на уровень ",Bid-Dist*_Point," за ",GetTickCount()-otladka_start," мс");
lastOOP_S=NormalizeDouble(Bid-Dist*_Point,_Digits);
need_move_S=false;
MoveRect();
//rivok0=(Ask+Bid)/2;
}
}
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| ОТКРЫТИЕ ОРДЕРА БС/СС, ЕСЛИ ТАКИХ НЕТУ НА ДАННЫЙ МОМЕНТ |
//+------------------------------------------------------------------+
if(!pendings_placed && TimeCurrent()>=timeStart && TimeCurrent()<timeFinish)
{
Print("Отложки выставлены по ТИКУ");
place_pendings();
}
}
if(!deal_opened)
{
if(TimeCurrent()<timeFinish)
{
if(TimeCurrent()-60>Minute_cur)
{
error=(ObjectMove(chart_ID,Rect1,0,TimeCurrent()+5*60,K1) && ObjectMove(chart_ID,Rect1,1,TimeCurrent()-5*60,K2));
error=ObjectMove(chart_ID,time_curr,0,TimeCurrent(),0);
Minute_cur=round(TimeCurrent()/60)*60;
}
if(Ask>K1 || Bid<K2)
{
if(!need_move_R)
{
need_move_R=true;
TTouched=TimeCurrent();
}
}
if((TimeCurrent()>TTouched+TimeModify) && (need_move_R))
{
if(TimeCurrent()<timeStart)
{
MoveRect();
error=ObjectMove(chart_ID,hor_line_1,0,0,Ask+Dist*_Point);
error=ObjectMove(chart_ID,hor_line_2,0,0,Bid-Dist*_Point);
}
need_move_R=false;
}
}
}
if(!local_time_corrected)
{
if(TimeLocal()>TimeCurrent()) otst=-1;
time_otst=otst*(TimeCurrent()-TimeLocal()); // time_otst=TimeCurrent()-otst*TimeLocal();
Print("time_otst = ",time_otst," , otst=",otst);
local_time_corrected=true;
}
//if(print_stats && OrdersTotal()==0) if_ended_text_stats();
// if (deal_opened && tick_count<20) tick_count++;
if(TimeCurrent()>=timeFinish)
{
CloseSel();
}
}
////////////////////////////+------------------------------------------------------------------+
////////////////////////////| КОНЕЦ ТИКА |
////////////////////////////+------------------------------------------------------------------+
////////////////////////////+------------------------------------------------------------------+
////////////////////////////| НАЧАЛО ТАЙМЕРА |
////////////////////////////+------------------------------------------------------------------+
void OnTimer()
{
if(tttimer>0 && (TimeCurrent()>timeStart && TimeCurrent()<timeFinish))
{
if(SymbolInfoTick(Symbol(),last_tick)) {Ask=last_tick.ask; Bid=last_tick.bid; }
STOPLEVEL=(SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL));
OSL=0;
OOP=0;
SL=0;
TRAILING(in_timer);
}
if(!pendings_placed && TimeLocal()+otst*time_otst>=timeStart && TimeCurrent()<timeFinish)
{
place_pendings();
Print("Отложки выставлены по ТАЙМЕРУ");
//rivok0=(Ask+Bid)/2;
}
if(TimeLocal()>time5sec+5 && print_stats && !stats_printed)
{
Print("Print stats...");
time5sec=TimeLocal();
if_ended_text_stats();
}
if(TimeCurrent()>timeFinish && stats_empty && !stats_empty_written)
{
create_text("stats_empty1","Время прошло, отложки так и не сработали",White);
StringConcatenate(stats_empty2str,timeStart," - ",timeFinish);
create_text("stats_empty2",stats_empty2str,White);
stats_empty_written=true;
}
ObjectSetString(chart_ID,time_left_str_text,OBJPROP_TEXT,TimeLeftCount());
ObjectSetInteger(chart_ID,time_left_str_text,OBJPROP_COLOR,TLclr);
ObjectSetString(chart_ID,server_time,OBJPROP_TEXT,TimeToString(TimeLocal()+otst*time_otst,TIME_SECONDS));
//ObjectSetString(chart_ID,server_time,OBJPROP_TEXT,GetMicrosecondCount());
/* if(pendings_placed)
{
time_gone_str=StringConcatenate("Прошло ",TimeToStr(TimeLocal()+otst*time_otst-timeStart,TIME_SECONDS));
ObjectSetString(chart_ID,time_left_str_text,OBJPROP_TEXT,time_gone_str);
ObjectSetInteger(chart_ID,time_left_str_text,OBJPROP_COLOR,Yellow);
// time_gone_str_placed=true;
}*/
if(pendings_placed && ObjectFind(0,time_left_str_text)!=-1)
{
error=ObjectDelete(chart_ID,time_left_str_text);
}
ChartRedraw(0);
}
////////////////////////////+------------------------------------------------------------------+
////////////////////////////| КОНЕЦ ТАЙМЕРА |
////////////////////////////+------------------------------------------------------------------+
////////////////////////////+------------------------------------------------------------------+
////////////////////////////| ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ (начало) |
////////////////////////////+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| CloseSel и CloseSeli |
//+------------------------------------------------------------------+
void CloseSel() // <0 - значит закрыть все
{
for(iic=0; iic<OrdersTotal(); iic++)
{
ticketN=OrderGetTicket(iic);
if(OrderGetString(ORDER_SYMBOL)==current_symbol)
{
OT=OrderGetInteger(ORDER_TYPE);
Print("Закрытие оставшейся отложки...");
otladka_start=GetTickCount();
if(Trade.OrderDelete(ticketN)) Print("Отложка № ",ticketN," закрыта за ",GetTickCount()-otladka_start," мс");
}
}
/*for(iic=0; iic<PositionsTotal(); iic++) // зачем закрывать позицию - не нужно
{
if(PositionGetString(POSITION_SYMBOL)==current_symbol)
{
ticketN=PositionGetTicket(iic);
if(!(iic==not_delete_i))
{
OT=PositionGetInteger(POSITION_TYPE);
if (Trade.PositionClose(current_symbol,ticketN)) { pending_closed=true;
}
}
}*/
}
/*
void CloseSel(int orderN) // <0 - значит закрыть все
{
for(i=0; i<OrdersTotal(); i++)
{
if(OrderGetString(ORDER_SYMBOL)==current_symbol)
{
ticketN=OrderGetTicket(i);
if(OrderSelect(ticketN) && !(i==orderN))
{
OT = OrderGetInteger(ORDER_TYPE);
if(OT==ORDER_TYPE_BUY) error=OrderClose(OrderTicket(), OrderLots(), MarketInfo(current_symbol, MODE_BID), slippage, CLR_NONE);
if(OT==ORDER_TYPE_SELL) error=OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), slippage, CLR_NONE);
if(OT==ORDER_TYPE_BUY_LIMIT || OT==ORDER_TYPE_BUY_STOP || OT==ORDER_TYPE_SELL_LIMIT || OT==ORDER_TYPE_SELL_STOP)
{
otladka_start=GetTickCount();
if (OrderDelete(OrderTicket()))
{
Print("Отложка № ",OrderTicket()," закрыта за ",GetTickCount()-otladka_start," мс");
}
}
}
}
}
if(ObjectFind(0,Rect1)!=-1) error=ObjectDelete(chart_ID,Rect1);
if(ObjectFind(0,time_left_str_text)!=-1 && orderN==-1) error=ObjectDelete(chart_ID,time_left_str_text);
}
*/
/*
void CloseSeli()
{
if (!pending_closed)
{
Print("Закрытие оставшейся отложки...");
CloseSel(ii); // if (tick_count>2) закрыть все кроме этого ордера
//Print("Отложка закрыта");
pending_closed=true;
}
} */
//+------------------------------------------------------------------+
//| TRAILING |
//+------------------------------------------------------------------+
void TRAILING(int tick_or_timer)
{
if(tick_or_timer==in_tick) tick_or_timer_str="ТИК"; else tick_or_timer_str="ТАЙМЕР";
for(iit=0; iit<PositionsTotal(); iit++)
{
ticketN=PositionGetTicket(iit);
if(PositionGetString(POSITION_SYMBOL)==current_symbol)
{
OT = PositionGetInteger(POSITION_TYPE);
OSL = PositionGetDouble(POSITION_SL);
OOP = PositionGetDouble(POSITION_PRICE_OPEN);
lastSL=OSL;
if(OT==POSITION_TYPE_BUY) sign_order=1;
if(OT==POSITION_TYPE_SELL) sign_order=-1;
SL=OSL;
if(OT==POSITION_TYPE_BUY || OT==POSITION_TYPE_SELL)
{
deal_opened=true;
if(OT==POSITION_TYPE_BUY) SL=Bid-TrailingStop*_Point; else SL=Ask+TrailingStop*_Point;
if(sign_order*(SL-OSL)>TSz*_Point)
{
if (SL0==0) SL0=OSL;
Print("Команда траллить!");
tral_start=GetTickCount();
if(Trade.PositionModify(ticketN,SL,0))
{
lastSL=SL;
TSsum=TSsum+sign_order*(SL-OSL);
Print("СЛ сдвинулся по ",tick_or_timer_str,"У на ",round(sign_order*(SL-OSL)/_Point)," пп , интервал сдвига ",GetTickCount()-tral_start," мс");
}
}
CloseSel(); // возможно нужно перенести в момент открытия статистики
if (!stats_printed) print_stats=true;
time5sec=TimeLocal();
}
}
}
}
//+------------------------------------------------------------------+
//| MoveRect |
//+------------------------------------------------------------------+
void MoveRect()
{
K1=Ask+Kor*_Point;
K2=Bid-Kor*_Point;
error=ObjectMove(chart_ID,Rect1,0,TimeCurrent()+5*60,K1) && ObjectMove(chart_ID,Rect1,1,TimeCurrent()-5*60,K2);
}
//+------------------------------------------------------------------+
//| place_pendings |
///+------------------------------------------------------------------+
void place_pendings()
{
STOPLEVEL=(SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL));
SL=0;
if(Stoploss>=STOPLEVEL && Stoploss!=0) SL=Ask+(Dist-Stoploss)*_Point; else SL=0;
otladka_start=GetTickCount();
if(Trade.OrderOpen(Symbol(),ORDER_TYPE_BUY_STOP,Lot,0,Ask+Dist*_Point,SL,0,0,0))
{
Print("Buy stop выставлена на уровень ",Ask+Dist*_Point," за ",GetTickCount()-otladka_start," мс");
lastOOP_B=Ask+Dist*_Point;
MoveRect();
}
if(Stoploss>=STOPLEVEL && Stoploss!=0) SL=Bid-(Dist-Stoploss)*_Point; else SL=0;
otladka_start=GetTickCount();
if(Trade.OrderOpen(Symbol(),ORDER_TYPE_SELL_STOP,Lot,0,Bid-Dist*_Point,SL,0,0,0))
{
Print("Sell stop выставлена на уровень ",Bid-Dist*_Point," за ",GetTickCount()-otladka_start," мс");
lastOOP_S=Bid-Dist*_Point;
MoveRect();
}
if(ObjectFind(0,hor_line_1)!=-1) error=ObjectDelete(chart_ID,hor_line_1);
if(ObjectFind(0,hor_line_2)!=-1) error=ObjectDelete(chart_ID,hor_line_2);
//rivok0=(Ask+Bid)/2;
pendings_placed=true;
}
//+------------------------------------------------------------------+
//| create_text (верхний) |
//+------------------------------------------------------------------+
void create_text(string name,string text,int clr)
{
otstup_level=otstup_up0+oi*otstup_up;
ObjectCreate(chart_ID,name,OBJ_LABEL,0,0,0);
//--- установим способ привязки
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,ANCHOR_RIGHT_UPPER);
//--- установим текст события
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- установим цвет
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,true);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,false);
//--- установим координаты метки
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,otstup_right);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,otstup_level);
//--- установим угол графика, относительно которого будут определяться координаты точки
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,CORNER_RIGHT_UPPER);
//--- установим шрифт текста
ObjectSetString(chart_ID,name,OBJPROP_FONT,"Calibri");
//--- установим размер шрифта
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
oi++;
}
//+------------------------------------------------------------------+
//| create_text (нижний) |
//+------------------------------------------------------------------+
void create_text1(string name,string text,int clr)
{
otstup_level1=otstup_up01+oi1*otstup_up1;
ObjectCreate(chart_ID,name,OBJ_LABEL,0,0,0);
//--- установим способ привязки
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,ANCHOR_RIGHT_LOWER);
//--- установим текст события
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- установим цвет
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,true);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,false);
//--- установим координаты метки
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,otstup_right);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,otstup_level1);
//--- установим угол графика, относительно которого будут определяться координаты точки
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,CORNER_RIGHT_LOWER);
//--- установим шрифт текста
ObjectSetString(chart_ID,name,OBJPROP_FONT,"Calibri");
//--- установим размер шрифта
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size1);
oi1++;
}
//+------------------------------------------------------------------+
//| string TimeLeftCount (строка с оставшимся временем) |
//+------------------------------------------------------------------+
string TimeLeftCount() // попробовать TimeTradeServer
{
time_left=timeStart-(TimeLocal()+otst*time_otst);
days_left=time_left/(24*60*60);
hours_left=(time_left/(60*60))-days_left*24;
mins_left=(time_left/60)-days_left*24*60-hours_left*60;
secs_left=time_left-days_left*24*60*60-hours_left*60*60-mins_left*60;
if(time_left<60) TLclr=Yellow; else TLclr=Lime;
if (time_left/(24*60*60)>=1) StringConcatenate(time_left_strstr,"Отложки через ",days_left," дн ",hours_left," ч ",mins_left," мин ",secs_left);
if (time_left/(60*60)>=1 && time_left/(24*60*60)<1) StringConcatenate(time_left_strstr,"Отложки через ",hours_left," ч ",mins_left," мин ",secs_left);
if (time_left/60>=1 && time_left/(60*60)<1) StringConcatenate(time_left_strstr,"Отложки через ",mins_left," мин ",secs_left);
if (time_left/60<1) StringConcatenate(time_left_strstr,"Отложки через ",secs_left);
//StringReplace(time_left_strstr,".0","");
string time_left_str=time_left_strstr;
return time_left_str;
}
//+------------------------------------------------------------------+
//| if_ended_text_stats |
//+------------------------------------------------------------------+
void if_ended_text_stats()
{
if (!stats_printed)
{
error=HistorySelect(timeStart,timeFinish);
// CloseSeli();
ticketN=0;
for(ii=0; ii<HistoryDealsTotal(); ii++)
{
ticketN=HistoryDealGetTicket(ii);
OT=HistoryDealGetInteger(ticketN,DEAL_TYPE);
if(HistoryDealGetString(ticketN,DEAL_SYMBOL)==current_symbol)
{
if (OT==DEAL_TYPE_BUY || OT==DEAL_TYPE_SELL)
{
if (HistoryDealGetInteger(ticketN,DEAL_ENTRY)==DEAL_ENTRY_IN) dealN=ticketN; else zdealN=ticketN;
}
}
}
/* for(i=0; i<HistoryOrdersTotal(); i++)
{
ticketN=HistoryOrderGetTicket(i);
OT=HistoryOrderGetInteger(ticketN,ORDER_TYPE);
if(HistoryOrderGetString(ticketN,ORDER_SYMBOL)==current_symbol && (OT==ORDER_TYPE_BUY || OT==ORDER_TYPE_SELL))
{
horderN=HistoryOrderGetTicket(i);
}
}
*/
stats_empty=false;
OT=HistoryDealGetInteger(dealN,DEAL_TYPE);
OOP=HistoryDealGetDouble(dealN,DEAL_PRICE);
double OCP=HistoryDealGetDouble(zdealN,DEAL_PRICE);
horderN=HistoryDealGetInteger(dealN,DEAL_ORDER);
//Print("horderN = ",horderN);
lastOOP=HistoryOrderGetDouble(horderN,ORDER_PRICE_OPEN);
//SL=HistoryOrderGetDouble(horderN,ORDER_SL);
SL=lastSL;
string order_history_ticket_str;
StringConcatenate(order_history_ticket_str,"Тикет ордера ",dealN);
create_text("order_history_ticket",order_history_ticket_str,DodgerBlue);
double deal_lot=HistoryDealGetDouble(dealN,DEAL_VOLUME);
string create_textstr;
if(OT==DEAL_TYPE_BUY)
{
//lastOOP=lastOOP_B;
sign_slip=1;
StringConcatenate(create_textstr,"Покупка объемом ",deal_lot," лота");
create_text("pokupka",create_textstr,DodgerBlue);
// color_rivok=Lime;
}
if(OT==DEAL_TYPE_SELL)
{
//lastOOP=lastOOP_S;
sign_slip=-1;
StringConcatenate(create_textstr,"Продажа объемом ",deal_lot," лота");
create_text("prodazha",create_textstr,DodgerBlue);
//color_rivok=Red;
}
//rivok0=rivok0+sign_slip*Spread/2;
long hOOT=HistoryDealGetInteger(dealN,DEAL_TIME),hOCT=HistoryDealGetInteger(zdealN,DEAL_TIME);
//Print("zdealN = ",zdealN);
string order_time_openstr;
StringConcatenate(order_time_openstr,"Открытие ордера в ",TimeToString(hOOT,TIME_SECONDS));
create_text("order_time_open",order_time_openstr,DodgerBlue);
string order_time_closestr;
StringConcatenate(order_time_closestr,"Закрытие ордера в ",TimeToString(hOCT,TIME_SECONDS));
create_text("order_time_close",order_time_closestr,DodgerBlue);
// if (sign_slip==1) rivok=round((iHigh(Symbol(),PERIOD_M1,0)-rivok0)/_Point); else rivok=round((rivok0-iLow(Symbol(),PERIOD_M1,0))/_Point);
//create_text("rivok",StringConcatenate("Рывок ",rivok),White);
order_open_slippage_int=round(sign_slip*(OOP-lastOOP)/_Point);
string order_open_slippagestr;
StringConcatenate(order_open_slippagestr,"Проскальзывание на открытии ",order_open_slippage_int);
StringReplace(order_open_slippagestr,".0","");
create_text(order_open_slippage,order_open_slippagestr,Yellow);
order_close_slippage_int=round(sign_slip*(SL-OCP)/_Point);
string order_close_slippagestr;
StringConcatenate(order_close_slippagestr,"Проскальзывание на закрытии ",order_close_slippage_int);
StringReplace(order_close_slippagestr,".0","");
create_text(order_close_slippage,order_close_slippagestr,DarkOrange);
string TSsum_pointsstr;
StringConcatenate(TSsum_pointsstr,"Общее движение СЛ ",round(TSsum/_Point));
StringReplace(TSsum_pointsstr,".0","");
create_text("TSsum_points",TSsum_pointsstr,White);
order_profit_p_int=round(sign_slip*(OCP-OOP)/_Point);
if(order_profit_p_int>=0) color_profit=Lime; else color_profit=Red;
string order_profit_pstr;
StringConcatenate(order_profit_pstr,"Профит ",order_profit_p_int);
StringReplace(order_profit_pstr,".0","");
create_text(order_profit_p,order_profit_pstr,color_profit);
string order_profitstr;
StringConcatenate(order_profitstr,"Профит ",HistoryDealGetDouble(zdealN,DEAL_PROFIT)," руб.");
create_text(order_profit,order_profitstr,color_profit);
create_tria("Open_tria",hOOT,lastOOP,hOOT+2*60,lastOOP,hOOT,OOP,Yellow,1);
create_tria("Close_tria",hOCT,SL,hOCT+2*60,SL,hOCT,OCP,DarkOrange,1);
create_tria("Profit_tria",hOOT,OOP,hOOT+60,OOP,hOCT,OCP,DodgerBlue,1);
//create_tria("moving_SL_tria",hOOT,SL0,hOOT+60,SL0,hOCT,OrderStopLoss(),DimGray,1);
// create_rect("order_open_slippage_rect",OrderOpenTime(),lastOOP,OrderCloseTime()-5*60,OrderOpenPrice(),DarkOrange);
// create_rect("order_profit_rect",OrderOpenTime(),OrderOpenPrice(),OrderCloseTime()-5*60,OrderClosePrice(),Blue);
// create_rect("order_close_slippage_rect",OrderOpenTime(),OrderStopLoss(),OrderCloseTime()-5*60,OrderClosePrice(),Yellow);
// create_arrow("order_rivok_arrow",OrderOpenTime()-5*60,lastOOP,White);
// create_rect("rivok_rect",OrderOpenTime()-6*60,NormalizeDouble(rivok0,_Digits),OrderCloseTime()-5*60,rivok0+sign_slip*rivok*_Point,color_rivok);
// create_tria("rivok_tria",OrderOpenTime()-6*60,rivok0+_Point,OrderOpenTime()-6*60,rivok0+sign_slip*rivok*_Point,OrderOpenTime()-8*60,rivok0+_Point,color_rivok);
// create_text_("rivok_points",StringConcatenate(round(rivok)),OrderOpenTime()-6*60,rivok0+rivok*_Point/2,White);
// create_text_("order_open_slippage_points",StringConcatenate("пр.откр. ",round(order_open_slippage_int)),OrderOpenTime()-3*60,(lastOOP+OrderOpenPrice())/2,White);
// create_text_("order_profit_p_int",StringConcatenate("профит ",round(order_profit_p_int)),OrderOpenTime()-3*60,(OrderOpenPrice()+OrderClosePrice())/2,White);
// create_text_("order_close_slippage_points",StringConcatenate("пр.закр. ",round(order_close_slippage_int)),OrderOpenTime()-3*60,(OrderClosePrice()+OrderStopLoss())/2,White);
string print_statsstr;
StringConcatenate(print_statsstr,"Dist=",Dist,", TS=",TrailingStop,"+",TSz,", SL=",Stoploss,", TM=",TimeModify,"s, Kor=",Kor,", Lot=",Lot);
Print(print_statsstr);
print_stats=false;
stats_printed=true;
}
}
//+------------------------------------------------------------------+
//| create_event |
//+------------------------------------------------------------------+
void create_event(string name,datetime time_ev,color color_ev)
{
error=ObjectCreate(chart_ID,name,OBJ_EVENT,0,time_ev,0);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,false);
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,true);
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,color_ev);
ObjectMove(chart_ID,name,0,time_ev,0);
}
//+------------------------------------------------------------------+
//| create_v_line |
//+------------------------------------------------------------------+
void create_v_line(string name,datetime time_l,color color_l,int style_l)
{
error=ObjectCreate(chart_ID,name,OBJ_VLINE,0,time_l,0);
//--- установим цвет линии
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,Blue);
//--- установим стиль отображения линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style_l);
//--- установим толщину линии
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,1);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,true);
ObjectMove(chart_ID,name,0,time_l,0);
}
//+------------------------------------------------------------------+
//| create_h_line |
//+------------------------------------------------------------------+
void create_h_line(string name,double price_l,color color_l,int style_l)
{
error=ObjectCreate(chart_ID,name,OBJ_HLINE,0,0,price_l);
//--- установим цвет линии
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,color_l);
//--- установим стиль отображения линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style_l);
//--- установим толщину линии
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,1);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,true);
ObjectMove(chart_ID,name,0,0,price_l);
}
//+------------------------------------------------------------------+
//| create_rect |
//+------------------------------------------------------------------+
void create_rect(string name,datetime time1,double price1,datetime time2,double price2,color color_r)
{
error=ObjectCreate(chart_ID,name,OBJ_RECTANGLE,0,time1,price1,time2,price2);
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,color_r);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,true);
ObjectSetInteger(chart_ID,name,OBJPROP_FILL,true);
}
//+------------------------------------------------------------------+
//| create_tria |
//+------------------------------------------------------------------+
void create_tria(string name,datetime time1,double price1,datetime time2,double price2,datetime time3,double price3,color color_t,int width)
{
error=ObjectCreate(chart_ID,name,OBJ_TRIANGLE,0,time1,price1,time2,price2,time3,price3);
//--- установим цвет треугольника
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,color_t);
//--- установим стиль линий треугольника
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,STYLE_SOLID);
//--- установим толщину линий треугольника
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,false);
//--- включим (true) или отключим (false) режим выделения треугольник для перемещений
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,true);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,false);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,false);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,false);
ObjectSetInteger(chart_ID,name,OBJPROP_FILL,true);
}
//+------------------------------------------------------------------+
//| create_arrow |
//+------------------------------------------------------------------+
void create_arrow(string name,datetime time,double price,color clr)
{
if(sign_slip==1) error=ObjectCreate(chart_ID,name,OBJ_ARROW_UP,0,time,price);
if(sign_slip==-1) error=ObjectCreate(chart_ID,name,OBJ_ARROW_DOWN,0,time,price);
if(!rivok==0)
{
//--- установим способ привязки
if(sign_slip==1) ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,ANCHOR_BOTTOM);
if(sign_slip==-1) ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,ANCHOR_TOP);
//--- установим цвет знака
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль окаймляющей линии
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,STYLE_SOLID);
//--- установим размер знака
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,10);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,false);
//--- включим (true) или отключим (false) режим перемещения знака мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,true);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,false);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,false);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,2);
}
}
//+------------------------------------------------------------------+
//| create_text_ (по координатам) |
//+------------------------------------------------------------------+
bool create_text_(string name,string text,datetime time,double price,color clr)
{
// ChangeTextEmptyPoint(time,price);
error=ObjectCreate(chart_ID,name,OBJ_TEXT,0,time,price);
//--- установим текст
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
ObjectSetString(chart_ID,name,OBJPROP_FONT,"Calibri");
//--- установим размер шрифта
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size_text_);
//--- установим угол наклона текста
ObjectSetDouble(chart_ID,name,OBJPROP_ANGLE,0);
//--- установим способ привязки
ObjectSetInteger(chart_ID,name,OBJPROP_ANCHOR,ANCHOR_CENTER);
//--- установим цвет
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- отобразим на переднем (false) или заднем (true) плане
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,false);
//--- включим (true) или отключим (false) режим перемещения объекта мышью
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,true);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,false);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,false);
//--- установим приоритет на получение события нажатия мыши на графике
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,0);
return(true);
}
//+------------------------------------------------------------------+