656 lines
51 KiB
MQL5
656 lines
51 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| rrr.mq4 |
|
|
//| Copyright 2017, MetaQuotes Software Corp. |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2017, MetaQuotes Software Corp."
|
|
#property link "https://www.mql5.com"
|
|
#property version "1.00"
|
|
#property strict
|
|
//+------------------------------------------------------------------+
|
|
//| Expert initialization function |
|
|
//+------------------------------------------------------------------+
|
|
extern int time_in=1;
|
|
extern int frame_stop=1;
|
|
extern int max_stop=1000;
|
|
extern int max_spreed=70;
|
|
extern bool from_balance=FALSE;
|
|
extern bool is_stop=FALSE;
|
|
extern bool only_trend=FALSE;
|
|
extern bool stop_blue=TRUE;
|
|
extern string now_trend="none";
|
|
/*
|
|
enum trendname
|
|
{
|
|
"none",
|
|
"buy", // Sunday
|
|
"sell" // Saturday
|
|
};
|
|
//--- input parameters
|
|
input trendname my;
|
|
*/
|
|
extern double Lots=0.01;
|
|
extern int first_frame=5;
|
|
//30
|
|
extern int first_num=10;
|
|
extern string tang="123";
|
|
//4
|
|
extern int stop_num=1;
|
|
//5
|
|
extern double risk_proc=0.5;
|
|
extern double min_open=3.01;
|
|
extern int max_buy=1;
|
|
extern int max_sell=1;
|
|
|
|
int buystopid, sellstopid;
|
|
void OnInit()
|
|
{
|
|
//---
|
|
if(now_trend=="none") now_trend=isho_trend(5);
|
|
//Alert(now_trend);
|
|
//---
|
|
// return(INIT_SUCCEEDED);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Expert deinitialization function |
|
|
//+------------------------------------------------------------------+
|
|
void OnDeinit(const int reason)
|
|
{
|
|
//---
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Expert tick function |
|
|
//+------------------------------------------------------------------+
|
|
string in_tang(string tang_id,int shift=0){
|
|
string out="null";
|
|
double price_bot=ObjectGet(tang_id,OBJPROP_PRICE1);
|
|
double price_top=ObjectGet(tang_id,OBJPROP_PRICE2);
|
|
double now_price=iOpen(Symbol(),5,shift);
|
|
if(shift==0)now_price=Bid;
|
|
if(now_price>price_top)out="top";
|
|
if(now_price<price_bot)out="niz";
|
|
if(now_price>price_bot && now_price<price_top)out="in tang";
|
|
return out;
|
|
}
|
|
string all_tag(){
|
|
string arr[4]={"top","bottom","top2","bottom2"};
|
|
int i;
|
|
string out="null";
|
|
for(i=0;i<4;i++){
|
|
if(in_tang(arr[i],2)=="in tang" && in_tang(arr[i])=="top")out=StringConcatenate("buy ",arr[i]);
|
|
if(in_tang(arr[i],2)=="in tang" && in_tang(arr[i])=="niz")out=StringConcatenate("sel ",arr[i]);
|
|
}
|
|
return out;
|
|
}
|
|
void OnTick()
|
|
{
|
|
//---
|
|
int total,cnt,order_buy_c,order_sell_c,buy_id=0,sell_id=0;
|
|
total = OrdersTotal();
|
|
buystopid=0;
|
|
sellstopid=0;
|
|
RectangleDelete(0,"bottom_5");
|
|
RectangleDelete(0,"top_5");
|
|
RectangleDelete(0,"bottom_5-2");
|
|
RectangleDelete(0,"top_5-2");
|
|
make_level("bottom",find_level("bottom",1,0,5),5,"bottom_5",clrAqua);
|
|
make_level("top",find_level("top",1,0,5),5,"top_5",clrBrown);
|
|
make_level("bottom",find_level("bottom",find_level("bottom",1,0,5)+2,0,5),5,"bottom_5-2",clrAquamarine);
|
|
make_level("top",find_level("top",find_level("top",1,0,5),0,5)+2,5,"top_5-2",clrBlue);
|
|
|
|
double pricetop_5=ObjectGet("top_5",OBJPROP_PRICE2);
|
|
double pricebottom_5=ObjectGet("bottom_5",OBJPROP_PRICE1);
|
|
for(cnt=0;cnt<total;cnt++)
|
|
{
|
|
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
|
|
if(OrderSymbol()!=Symbol())continue;
|
|
if(is_stop==TRUE)
|
|
make_stop(OrderTicket());
|
|
if(OrderType()==OP_BUYSTOP)buystopid=OrderTicket();
|
|
if(OrderType()==OP_SELLSTOP)sellstopid=OrderTicket();
|
|
if(OrderType()==OP_BUY ){
|
|
order_buy_c++;
|
|
pricebottom_5=pricebottom_5-5*Point;
|
|
if(pricebottom_5>OrderOpenPrice() && OrderStopLoss()<pricebottom_5 && is_stop==TRUE){
|
|
OrderModify(OrderTicket(),OrderOpenPrice(),pricebottom_5,OrderTakeProfit(),0,clrDarkViolet);
|
|
if(sellstopid>0)OrderDelete(sellstopid);
|
|
}
|
|
buy_id=OrderTicket();
|
|
}
|
|
if(OrderType()==OP_SELL ){
|
|
pricetop_5=pricetop_5+MarketInfo(Symbol(),MODE_SPREAD)*Point+5*Point;
|
|
if(pricetop_5<OrderOpenPrice() && pricetop_5<OrderStopLoss() && is_stop==TRUE){
|
|
OrderModify(OrderTicket(),OrderOpenPrice(),pricetop_5,OrderTakeProfit(),0,clrDarkViolet);
|
|
if(buystopid>0)OrderDelete(buystopid);
|
|
|
|
}
|
|
order_sell_c++;
|
|
sell_id=OrderTicket();
|
|
}
|
|
}
|
|
/*
|
|
if((order_buy_c<1 && (make_money(1)=="buy" || make_money(time_in)=="buy")) || (order_sell_c<1 && (make_money(1)=="sell" || make_money(time_in)=="sell"))){
|
|
open_order(make_money(time_in));
|
|
//open_order(make_money(1));
|
|
if(make_money(1)=="buy" && order_sell_c>0)my_close(sell_id);
|
|
if(make_money(1)=="sell" && order_buy_c>0)my_close(buy_id);
|
|
}
|
|
*/
|
|
double price1=ObjectGet(tang,OBJPROP_PRICE1);
|
|
double price2=ObjectGet(tang,OBJPROP_PRICE2);
|
|
Comment(now_trend,"--",all_tag(),"-",order_buy_c," ",order_sell_c,"is5-",isho_trend(5)," all",check_all(),make_take(240,"sell"),"b0=",bband(time_in,"up",0)-bband(time_in,"down",0)," b1=",bband(time_in,"up",1)-bband(time_in,"down",1),"==",(bband(time_in,"up",0)-bband(time_in,"down",0))-(bband(time_in,"up",1)-bband(time_in,"down",1))," ",b_flat(),"pr ",in_tang(tang));
|
|
|
|
double line_low=iLow(Symbol(),first_frame,iLowest(Symbol(),first_frame,MODE_LOW,first_num,2));
|
|
double line_top=iHigh(Symbol(),first_frame,iHighest(Symbol(),first_frame,MODE_HIGH,first_num,2));
|
|
|
|
make_line("top_line",line_top);
|
|
make_line("bot",line_low);
|
|
double pricetop=ObjectGet("top",OBJPROP_PRICE2);
|
|
double pricebottom=ObjectGet("bottom",OBJPROP_PRICE1);
|
|
double fr5=make_level_before("bot_price","bot",1,5);
|
|
RectangleDelete(0,"bottom_5");
|
|
RectangleDelete(0,"top_5");
|
|
make_level("bottom",find_level("bottom",1,0,5),5,"bottom_5",clrAqua);
|
|
make_level("top",find_level("top",1,0,5),5,"top_5",clrBrown);
|
|
//make_level(
|
|
//if(make_level_before("top_price","top",find_level("top"))!=pricetop){
|
|
RectangleDelete(0,"top");
|
|
RectangleDelete(0,"bottom");
|
|
RectangleDelete(0,"bottom2");
|
|
RectangleDelete(0,"top2");
|
|
make_level("top",find_level("top"));
|
|
make_level("bottom",find_level("bottom"));
|
|
make_level("top",find_level("top",find_level("top")+1,1),60,"top2");
|
|
make_level("bottom",find_level("bottom",find_level("bottom")+1,1),60,"bottom2");
|
|
double f_max=find_max();
|
|
double f_min=find_min();
|
|
make_line("l_top",f_max,clrYellow,to_price(f_max));
|
|
make_line("l_bot",f_min,clrYellow,to_price(f_min));
|
|
ChartRedraw();
|
|
//}
|
|
// open new StringSubstr
|
|
|
|
if(buy_id>sell_id && buy_id>0)now_trend="buy";
|
|
if(buy_id<sell_id && sell_id>0)now_trend="sell";
|
|
if(order_buy_c<max_buy && to_price(f_max)>to_price(f_min) && /*StringSubstr(all_tag(),0,3)=="buy" && iClose(Symbol(),5,1)>line_top &&*/ ((iLow(Symbol(),5,1)<ObjectGet("top_5",OBJPROP_PRICE1) && iOpen(Symbol(),5,0)>ObjectGet("top_5",OBJPROP_PRICE2)) || (iLow(Symbol(),5,1)<ObjectGet("bottom_5",OBJPROP_PRICE1) && iOpen(Symbol(),5,0)>ObjectGet("bottom_5",OBJPROP_PRICE2)) )&& now_trend!="buy"){open_order2("buy",StringSubstr(all_tag(),4));my_close(sell_id);now_trend="buy";}
|
|
if(order_sell_c<max_sell && to_price(f_max)<to_price(f_min) && /*StringSubstr(all_tag(),0,3)=="sel" && (iClose(Symbol(),5,1)< line_low ||*/ ( iHigh(Symbol(),5,1)>ObjectGet("top_5",OBJPROP_PRICE2) && iOpen(Symbol(),5,0)<ObjectGet("top_5",OBJPROP_PRICE1)) && now_trend!="sell"){open_order2("sell",StringSubstr(all_tag(),4));my_close(buy_id);now_trend="sell";}
|
|
|
|
if(sell_id==0 && buystopid>0)OrderDelete(buystopid);
|
|
if(buy_id==0 && sellstopid>0)OrderDelete(sellstopid);
|
|
|
|
}
|
|
double make_level_before(string want="top_price",string to="top",int shift=0, int frame=60){
|
|
double bot_price,top_price,pr1,pr2,out;
|
|
int shift2=shift+1;
|
|
// string out=to;
|
|
if(to=="top"){
|
|
bot_price=iOpen(Symbol(),frame,shift);
|
|
pr1=iHigh(Symbol(),frame,shift);
|
|
pr2=iHigh(Symbol(),frame,shift2);
|
|
if(pr1>pr2)top_price=pr1;
|
|
else top_price=pr2;
|
|
}
|
|
if(to=="bottom"){
|
|
top_price=iOpen(Symbol(),frame,shift);
|
|
pr1=iLow(Symbol(),frame,shift);
|
|
pr2=iLow(Symbol(),frame,shift2);
|
|
if(pr1<pr2)bot_price=pr1;
|
|
else bot_price=pr2;
|
|
|
|
}
|
|
if(want=="top_price")out=top_price;
|
|
else out=bot_price;
|
|
return out;
|
|
}
|
|
bool make_level(string to="top",int shift=0, int frame=60, string name="top", color clr=clrOrange){
|
|
double bot_price=make_level_before("bot_price",to,shift,frame);
|
|
double top_price=make_level_before("top_price",to,shift,frame);
|
|
if(name=="top")name=to;
|
|
RectangleCreate(0,name,0,iTime(Symbol(),frame,shift)-frame*60,bot_price,iTime(Symbol(),frame,0)+frame*60,top_price,clr);
|
|
return(true);
|
|
}
|
|
|
|
int find_level(string to="top",int from=1, int next=0, int frame=60){
|
|
int b;
|
|
for(b=from;b<2000;b++){
|
|
if(check_level(b,frame)==to){
|
|
if(next==0)
|
|
break;
|
|
else{
|
|
if(to=="top" && iOpen(Symbol(),frame,b)>iOpen(Symbol(),frame,0))break;
|
|
if(to=="bottom" && iOpen(Symbol(),frame,b)<iOpen(Symbol(),frame,0))break;
|
|
}
|
|
}
|
|
}
|
|
return b;
|
|
}
|
|
string check_level(int shift=1, int frame=60){
|
|
string out="null";
|
|
int last=shift+1;
|
|
int last3=shift+2;
|
|
if(iOpen(Symbol(),frame,last)>iClose(Symbol(),frame,last) && iClose(Symbol(),frame,shift)>iOpen(Symbol(),frame,shift)
|
|
&& iOpen(Symbol(),frame,last3)> iOpen(Symbol(),frame,last)
|
|
)
|
|
out="bottom";
|
|
|
|
if(iOpen(Symbol(),frame,last)<iClose(Symbol(),frame,last) && iClose(Symbol(),frame,shift)<iOpen(Symbol(),frame,shift)
|
|
&& iOpen(Symbol(),frame,last3)< iOpen(Symbol(),frame,last)
|
|
)
|
|
out="top";
|
|
|
|
return out;
|
|
|
|
}
|
|
void my_close(int id){
|
|
OrderSelect(id,SELECT_BY_TICKET,MODE_TRADES);
|
|
if(OrderProfit()+OrderCommission()+OrderSwap()>0){
|
|
if(OrderType()==OP_BUY){OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);OrderDelete(sellstopid);}
|
|
if(OrderType()==OP_SELL){OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);OrderDelete(buystopid);}
|
|
}
|
|
}
|
|
|
|
|
|
string stoch_trend(int frame){
|
|
string out="null";
|
|
if(iStochastic(Symbol(),frame,5,3,3,MODE_SMA,0,MODE_MAIN,0)>iStochastic(Symbol(),frame,5,3,3,MODE_SMA,0,MODE_SIGNAL,0))out="buy";
|
|
else out="sell";
|
|
return out;
|
|
}
|
|
string stoch(int frame){
|
|
string out="null";
|
|
double st=iStochastic(Symbol(),frame,5,3,3,MODE_SMA,0,MODE_SIGNAL,0);
|
|
if(st>70)out="sell";
|
|
if(st<30)out="buy";
|
|
return out;
|
|
}
|
|
double stoch_db(int frame){
|
|
return iStochastic(Symbol(),frame,5,3,3,MODE_SMA,0,MODE_SIGNAL,0);
|
|
}
|
|
string check_stoch(int frame){
|
|
string out="not";
|
|
if(stoch(frame)==stoch_trend(frame))out=stoch(frame);
|
|
return out;
|
|
}
|
|
string bar_op(int frame){
|
|
string out="null";
|
|
double low_last=iLow(Symbol(),frame,1);
|
|
double close_last=iClose(Symbol(),frame,1);
|
|
double open_last=iOpen(Symbol(),frame,1);
|
|
double high_last=iHigh(Symbol(),frame,1);
|
|
double open_now=iOpen(Symbol(),frame,0);
|
|
double half_buy=(open_last-close_last)/2+open_last;
|
|
double half_sell=(close_last-open_last)/2-close_last;
|
|
if(open_last>close_last && close_last-low_last>2*Point && Bid>half_buy)out="buy";
|
|
if(close_last>open_last && high_last-close_last>2*Point && half_buy>Bid)out="sell";
|
|
return out;
|
|
}
|
|
|
|
string isho_trend(int frame){
|
|
string out="null";
|
|
double span_a=iIchimoku(Symbol(),frame,9,26,52,MODE_SENKOUSPANA,0);
|
|
double span_b=iIchimoku(Symbol(),frame,9,26,52,MODE_SENKOUSPANB,0);
|
|
if(Bid<span_a && Bid<span_b)out="sell";
|
|
if(Bid>span_a && Bid>span_b)out="buy";
|
|
|
|
return out;
|
|
|
|
}
|
|
|
|
string check_all(){
|
|
int arr[4]={5,15,30,60};
|
|
int i;
|
|
string out;
|
|
out=isho_trend(60);
|
|
for(i=0;i<4;i++){
|
|
if(isho_trend(arr[i])!=out)out=StringConcatenate(out," in ",arr[i],"-",isho_trend(arr[i]));
|
|
}
|
|
//Alert(out);
|
|
return out;
|
|
}
|
|
double find_max(int to=5){
|
|
int arr[5]={1,5,15,30,60};
|
|
int i;
|
|
double out,out1;
|
|
out=0;
|
|
for(i=0;i<to;i++){
|
|
|
|
out1=iBands(Symbol(),arr[i],20,2,0,PRICE_CLOSE,MODE_UPPER,0);
|
|
if(out1>out)out=out1;
|
|
}
|
|
return out;
|
|
}
|
|
double find_min(int to=5){
|
|
int arr[5]={1,5,15,30,60};
|
|
int i;
|
|
double out,out1;
|
|
out=10000000;
|
|
for(i=0;i<to;i++){
|
|
|
|
out1=iBands(Symbol(),arr[i],20,2,0,PRICE_CLOSE,MODE_LOWER,0);
|
|
if(out1<out)out=out1;
|
|
}
|
|
return out;
|
|
}
|
|
|
|
string make_money(int frame){
|
|
string out="null";
|
|
double red=iIchimoku(Symbol(),frame,9,26,52,MODE_TENKANSEN,0);
|
|
double blue=iIchimoku(Symbol(),frame,9,26,52,MODE_KIJUNSEN,0);
|
|
double red_last=iIchimoku(Symbol(),frame,9,26,52,MODE_TENKANSEN,2);
|
|
double blue_last=iIchimoku(Symbol(),frame,9,26,52,MODE_KIJUNSEN,2);
|
|
double green=iIchimoku(Symbol(),frame,9,26,52,MODE_CHIKOUSPAN,26);
|
|
double close26=iClose(Symbol(),frame,26);
|
|
double span_a=iIchimoku(Symbol(),frame,9,26,52,MODE_SENKOUSPANA,0);
|
|
double span_b=iIchimoku(Symbol(),frame,9,26,52,MODE_SENKOUSPANB,0);
|
|
double span_high,span_low;
|
|
if(span_a>span_b){span_high=span_a;span_low=span_b;}
|
|
else{span_high=span_b;span_low=span_a;}
|
|
if(only_trend==FALSE){
|
|
if(isho_trend(60)!=isho_trend(frame) && isho_trend(1)!="null" && isho_trend(60)==check_all()){
|
|
if(isho_trend(frame)=="sell" && check_stoch(frame)=="sell" && bar_op(frame)=="sell" && stoch_db(5)>40)out="sell";
|
|
if(isho_trend(frame)=="buy" && check_stoch(frame)=="buy" && bar_op(frame)=="buy" && stoch_db(5)<60)out="buy";
|
|
|
|
|
|
}
|
|
}
|
|
/*
|
|
if(isho_trend(60)==isho_trend(frame) && isho_trend(1)!="null"){
|
|
|
|
if(isho_trend(frame)=="sell" && check_stoch(frame)=="sell" && bar_op(frame)=="sell" && stoch_db(5)>40)out="sell";
|
|
if(isho_trend(frame)=="buy" && check_stoch(frame)=="buy" && bar_op(frame)=="buy" && stoch_db(5)<60)out="buy";
|
|
|
|
}
|
|
*/
|
|
if(frame>4){
|
|
if(stoch_db(time_in)>0){
|
|
if(red_last>=blue_last && blue>red && Bid<red && green<close26 && in_cloud(frame)==FALSE)out="sell";
|
|
if(in_cloud(frame,1)==TRUE && in_cloud(frame)==FALSE && blue>red && Bid<red && green<close26 && isho_trend(frame)=="sell" && red<span_high && red<span_low)out="sell";
|
|
}
|
|
if(stoch_db(time_in)<100){
|
|
if(red_last<=blue_last && blue<red && Bid>red && green>close26 && in_cloud(frame)==FALSE)out="buy";
|
|
|
|
if(in_cloud(frame,1)==TRUE && in_cloud(frame)==FALSE && blue<red && Bid>red && green>close26 && isho_trend(frame)=="buy" && red>span_low && red>span_high)out="buy";
|
|
}
|
|
}
|
|
return out;
|
|
|
|
}
|
|
|
|
string b_flat(){
|
|
string out="null";
|
|
double b0=(bband(time_in,"up",0)-bband(time_in,"down",0))/Point;
|
|
double b1=(bband(time_in,"up",1)-bband(time_in,"down",1))/Point;
|
|
if(b0-b1<5)out="flat";
|
|
//Alert(b0);
|
|
if(b0<20)out="flat";
|
|
return out;
|
|
}
|
|
string open_order(string in, string oo="null"){
|
|
string comm=StringConcatenate("iSHO ",time_in," tr H4-",isho_trend(240)," tr H1-",isho_trend(60));
|
|
|
|
|
|
|
|
if(MarketInfo(Symbol(),MODE_SPREAD)<max_spreed && b_flat()!="flat"){
|
|
if(in=="sell"
|
|
// && to_price(make_take(240,"sell"))/to_price(stop_lost_f("OP_SELL"))>min_open
|
|
)OrderSend(Symbol(),OP_SELL,make_lot("OP_SELL"),Bid,3,stop_lost_f("OP_SELL"),make_take(240,"sell"), comm,12345,0,Red);
|
|
if(in=="buy"
|
|
// && to_price(make_take(240,"buy"))/to_price(stop_lost_f("OP_BUY"))>min_open
|
|
)OrderSend(Symbol(),OP_BUY,make_lot("OP_BUY"),Ask,3,stop_lost_f("OP_BUY"),make_take(240,"buy"), comm,12345,0,Green);
|
|
}
|
|
return 0;
|
|
}
|
|
string open_order2(string in, string oo="null"){
|
|
string comm=StringConcatenate("new ",time_in," ",oo," tr H4-",isho_trend(240)," tr H1-",isho_trend(60));
|
|
|
|
// double pricetop=ObjectGet("top",OBJPROP_PRICE1);
|
|
//double pricebottom=ObjectGet("bottom",OBJPROP_PRICE2);
|
|
|
|
double pricetop=ObjectGet(oo,OBJPROP_PRICE2)+MarketInfo(Symbol(),MODE_SPREAD)*Point+10*Point;
|
|
double pricebottom=ObjectGet(oo,OBJPROP_PRICE1)-10*Point;
|
|
pricetop=find_max(5)+MarketInfo(Symbol(),MODE_SPREAD)*Point+10*Point;
|
|
pricebottom=find_min(5)-10*Point;
|
|
if(to_price(pricetop)<MarketInfo(Symbol(),MODE_STOPLEVEL))pricetop=Bid+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point+10*Point;
|
|
if(to_price(pricebottom)<MarketInfo(Symbol(),MODE_STOPLEVEL))pricebottom=Ask-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point-10*Point;
|
|
if(MarketInfo(Symbol(),MODE_SPREAD)<max_spreed){
|
|
if(in=="sell"
|
|
// && to_price(make_take(240,"sell"))/to_price(stop_lost_f("OP_SELL"))>min_open
|
|
|
|
// stop_lost_f("OP_SELL")
|
|
){
|
|
OrderSend(Symbol(),OP_SELL,make_lot2("OP_SELL",pricetop),Bid,3,pricetop,0, comm,12345,0,Red);
|
|
OrderSend(Symbol(),OP_BUYSTOP,make_lot2("OP_SELL",pricetop),pricetop,3,Bid,0, comm,12345,0,Red);
|
|
}
|
|
if(in=="buy"
|
|
// && to_price(make_take(240,"buy"))/to_price(stop_lost_f("OP_BUY"))>min_open
|
|
// stop_lost_f("OP_BUY")
|
|
){OrderSend(Symbol(),OP_BUY,make_lot2("OP_BUY",pricebottom),Ask,3,pricebottom,0, comm,12345,0,Green);
|
|
OrderSend(Symbol(),OP_SELLSTOP,make_lot2("OP_BUY",pricebottom),pricebottom,3,Ask,0, comm,12345,0,Green);
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
// проверка лота
|
|
double make_lot(string to){
|
|
int points=to_price(stop_lost_f(to),to);
|
|
double max_money;
|
|
if(from_balance==TRUE)
|
|
max_money=AccountBalance()*risk_proc/100;
|
|
else max_money=AccountEquity()*risk_proc/100;
|
|
double price1=MarketInfo(Symbol(),MODE_TICKVALUE);
|
|
double out_lot=max_money/points/price1;
|
|
out_lot=NormalizeDouble(MathAbs(out_lot),2);
|
|
if(out_lot<0.01)
|
|
out_lot=0.01;
|
|
return out_lot;
|
|
}
|
|
double make_lot2(string to,double stop_price){
|
|
int points=to_price(stop_price,to);
|
|
double max_money;
|
|
if(from_balance==TRUE)
|
|
max_money=AccountBalance()*risk_proc/100;
|
|
else max_money=AccountEquity()*risk_proc/100;
|
|
double price1=MarketInfo(Symbol(),MODE_TICKVALUE);
|
|
double out_lot=max_money/points/price1;
|
|
out_lot=NormalizeDouble(MathAbs(out_lot),2);
|
|
if(out_lot<0.01)
|
|
out_lot=0.01;
|
|
return out_lot;
|
|
}
|
|
// установка стоплоса аллигатор
|
|
double stop_lost_f(string or="null"){
|
|
double out,out2;
|
|
//if(or!="null"){
|
|
if(or=="OP_BUY"){
|
|
out=iLow(Symbol(),first_frame,iLowest(Symbol(),first_frame,MODE_LOW,first_num,0));
|
|
out2=find_min(stop_num);
|
|
if(out2<out)out=out2;
|
|
out=out-7*Point;
|
|
//if(to_price(out,"OP_BUY")>max_stop)out=Ask-max_stop*Point;
|
|
if(to_price(out)<MarketInfo(Symbol(),MODE_STOPLEVEL))out=Ask-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
|
|
}
|
|
if(or=="OP_SELL"){
|
|
out=iHigh(Symbol(),first_frame,iHighest(Symbol(),first_frame,MODE_HIGH,first_num,0));
|
|
//if(to_price(out)>max_stop)out=Bid+max_stop*Point;
|
|
out2=find_max(stop_num);
|
|
if(out2>out)out=out2;
|
|
out=out+MarketInfo(Symbol(),MODE_SPREAD)*Point+7*Point;
|
|
if(to_price(out)<MarketInfo(Symbol(),MODE_STOPLEVEL))out=Bid+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
|
|
}
|
|
//out=0;
|
|
return out;
|
|
}
|
|
double bband(int frame, string to,int shift=0){
|
|
double out;
|
|
if(to=="up")
|
|
out=iBands(Symbol(),frame,20,2,0,PRICE_CLOSE,MODE_UPPER,shift);
|
|
else out=iBands(Symbol(),frame,20,2,0,PRICE_CLOSE,MODE_LOWER,shift);
|
|
//out=0;
|
|
return out;
|
|
}
|
|
double make_take(int frame, string to,int shift=0){
|
|
double out;
|
|
if(to=="buy")
|
|
out=iBands(Symbol(),frame,20,2,0,PRICE_CLOSE,MODE_UPPER,shift);
|
|
else out=iBands(Symbol(),frame,20,2,0,PRICE_CLOSE,MODE_LOWER,shift);
|
|
out=0;
|
|
return out;
|
|
}
|
|
// до цены Новый
|
|
int to_price(double price,string to="OP_SELL"){
|
|
double my_price=Bid;
|
|
if(to=="OP_BUY")my_price=Ask;
|
|
return MathAbs((price-my_price)/Point);
|
|
}
|
|
bool in_cloud(int frame, int shift=0){
|
|
bool out=FALSE;
|
|
double span_a=iIchimoku(Symbol(),frame,9,26,52,MODE_SENKOUSPANA,shift);
|
|
double span_b=iIchimoku(Symbol(),frame,9,26,52,MODE_SENKOUSPANB,shift);
|
|
double span_b_last=iIchimoku(Symbol(),frame,9,26,52,MODE_SENKOUSPANB,1);
|
|
double blue=iIchimoku(Symbol(),frame,9,26,52,MODE_KIJUNSEN,shift);
|
|
double price;
|
|
if(shift==0)price=Bid;
|
|
else price=iClose(Symbol(),frame,shift);
|
|
double span_high,span_low;
|
|
if(span_a>span_b){span_high=span_a;span_low=span_b;}
|
|
else{span_high=span_b;span_low=span_a;}
|
|
if(price>span_low && price<span_high)out=TRUE;
|
|
return out;
|
|
}
|
|
string make_stop(int id){
|
|
OrderSelect(id,SELECT_BY_TICKET,MODE_TRADES);
|
|
double span_a=iIchimoku(Symbol(),frame_stop,9,26,52,MODE_SENKOUSPANA,0);
|
|
double span_b=iIchimoku(Symbol(),frame_stop,9,26,52,MODE_SENKOUSPANB,0);
|
|
double span_b_last=iIchimoku(Symbol(),frame_stop,9,26,52,MODE_SENKOUSPANB,1);
|
|
double blue=iIchimoku(Symbol(),frame_stop,9,26,52,MODE_KIJUNSEN,0);
|
|
double red=iIchimoku(Symbol(),frame_stop,9,26,52,MODE_TENKANSEN,0);
|
|
double span_high,span_low;
|
|
if(span_a>span_b){span_high=span_a;span_low=span_b;}
|
|
else{span_high=span_b;span_low=span_a;}
|
|
blue=red;
|
|
if(stop_blue==TRUE){span_high=blue;span_low=blue;}
|
|
if(OrderType()==OP_BUY){
|
|
|
|
if(Bid>span_high && to_price(span_low,"OP_BUY")>50 && span_low-OrderOpenPrice()>10*Point && span_low>OrderStopLoss()
|
|
&& stoch_db(1)<50
|
|
)
|
|
OrderModify(OrderTicket(),OrderOpenPrice(),span_low-5*Point,OrderTakeProfit(),0,clrDarkViolet);
|
|
}
|
|
//Alert(OrderType());
|
|
if(OrderType()==OP_SELL){
|
|
double set_stop=span_high+MarketInfo(Symbol(),MODE_SPREAD)*Point+7*Point;
|
|
if(
|
|
span_low>Ask &&
|
|
to_price(span_high)>50 && OrderOpenPrice()-set_stop>10*Point && (set_stop<OrderStopLoss() || OrderStopLoss()==0)
|
|
&& stoch_db(1)>50
|
|
){
|
|
OrderModify(OrderTicket(),OrderOpenPrice(),set_stop,OrderTakeProfit(),0,clrDarkViolet);
|
|
// Alert("Ok");
|
|
}
|
|
}
|
|
return 0;
|
|
//Alert(Symbol()," ",to_price(span_b)," ",OrderOpenPrice()-span_b);
|
|
}
|
|
bool make_line(string name,double price,color col=Magenta,string dis=""){
|
|
ObjectDelete(name);
|
|
ObjectCreate(name,OBJ_HLINE,0,0,price);
|
|
ObjectSet(name,OBJPROP_COLOR,col);
|
|
ObjectSet(name,OBJPROP_STYLE,STYLE_DASHDOTDOT);
|
|
ObjectSetString(0,name,OBJPROP_TEXT,dis);
|
|
return true;
|
|
}
|
|
bool RectangleCreate(const long chart_ID=0, // ID графика
|
|
const string name="Rectangle", // имя прямоугольника
|
|
const int sub_window=0, // номер подокна
|
|
datetime time1=0, // время первой точки
|
|
double price1=0, // цена первой точки
|
|
datetime time2=0, // время второй точки
|
|
double price2=0, // цена второй точки
|
|
const color clr=clrOrange, // цвет прямоугольника
|
|
const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий прямоугольника
|
|
const int width=1, // толщина линий прямоугольника
|
|
const bool fill=true, // заливка прямоугольника цветом
|
|
const bool back=true, // на заднем плане
|
|
const bool selection=true, // выделить для перемещений
|
|
const bool hidden=false, // скрыт в списке объектов
|
|
const long z_order=0) // приоритет на нажатие мышью
|
|
{
|
|
//--- установим координаты точек привязки, если они не заданы
|
|
//ChangeRectangleEmptyPoints(time1,price1,time2,price2);
|
|
//--- сбросим значение ошибки
|
|
ResetLastError();
|
|
//--- создадим прямоугольник по заданным координатам
|
|
if(!ObjectCreate(chart_ID,name,OBJ_RECTANGLE,0,time1,price1,time2,price2))
|
|
{
|
|
Print(__FUNCTION__,
|
|
": не удалось создать прямоугольник! Код ошибки = ",GetLastError());
|
|
return(false);
|
|
}
|
|
//--- установим цвет прямоугольника
|
|
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
|
|
//--- установим стиль линий прямоугольника
|
|
ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
|
|
//--- установим толщину линий прямоугольника
|
|
ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
|
|
//--- отобразим на переднем (false) или заднем (true) плане
|
|
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
|
|
//--- включим (true) или отключим (false) режим выделения прямоугольника для перемещений
|
|
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
|
|
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
|
|
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
|
|
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
|
|
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
|
|
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
|
|
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
|
|
//--- установим приоритет на получение события нажатия мыши на графике
|
|
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
|
|
//--- успешное выполнение
|
|
return(true);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Перемещает точку привязки прямоугольника |
|
|
//+------------------------------------------------------------------+
|
|
bool RectanglePointChange(const long chart_ID=0, // ID графика
|
|
const string name="Rectangle", // имя прямоугольника
|
|
const int point_index=0, // номер точки привязки
|
|
datetime time=0, // координата времени точки привязки
|
|
double price=0) // координата цены точки привязки
|
|
{
|
|
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
|
|
if(!time)
|
|
time=TimeCurrent();
|
|
if(!price)
|
|
price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
|
|
//--- сбросим значение ошибки
|
|
ResetLastError();
|
|
//--- переместим точку привязки
|
|
if(!ObjectMove(chart_ID,name,point_index,time,price))
|
|
{
|
|
Print(__FUNCTION__,
|
|
": не удалось переместить точку привязки! Код ошибки = ",GetLastError());
|
|
return(false);
|
|
}
|
|
//--- успешное выполнение
|
|
return(true);
|
|
}
|
|
|
|
void my_ret(){
|
|
|
|
}
|
|
bool RectangleDelete(const long chart_ID=0, // ID графика
|
|
const string name="Rectangle") // имя прямоугольника
|
|
{
|
|
//--- сбросим значение ошибки
|
|
ResetLastError();
|
|
//--- удалим прямоугольник
|
|
if(!ObjectDelete(chart_ID,name))
|
|
{
|
|
Print(__FUNCTION__,
|
|
": не удалось удалить прямоугольник! Код ошибки = ",GetLastError());
|
|
return(false);
|
|
}
|
|
//--- успешное выполнение
|
|
return(true);
|
|
}
|
|
//+------------------------------------------------------------------+
|