280 lines
No EOL
16 KiB
MQL5
280 lines
No EOL
16 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| ba.mq5 |
|
|
//| Copyright 2018, MetaQuotes Software Corp. |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
//+------------------------------------------------------------------+
|
|
//| Expert initialization function |
|
|
//+------------------------------------------------------------------+
|
|
#include <ChartObjects\ChartObjectsShapes.mqh>
|
|
#include <ChartObjects\ChartObjectsFibo.mqh>
|
|
#include <ChartObjects\ChartObject.mqh>
|
|
#include <Trade\SymbolInfo.mqh>
|
|
#include <Trade\AccountInfo.mqh>
|
|
#include <Trade\Trade.mqh>
|
|
|
|
#include <Expert\Money\MoneyFixedRisk.mqh>
|
|
//---
|
|
CChartObjectRectangle Rect;
|
|
CChartObjectFibo Fibo;
|
|
CTrade trade;
|
|
CSymbolInfo m_symbol;
|
|
CMoneyFixedRisk money;
|
|
|
|
//---
|
|
input ENUM_TIMEFRAMES trade_bar=PERIOD_H1;
|
|
input ENUM_TIMEFRAMES period=PERIOD_H1;
|
|
input int days = 10;
|
|
input double Money_FixRisk_Percent=0.5;
|
|
//+------------------------------------------------------------------+
|
|
//| Expert initialization function |
|
|
//+------------------------------------------------------------------+
|
|
int OnInit()
|
|
{
|
|
EventSetTimer(1);
|
|
m_symbol.Name(Symbol());
|
|
m_symbol.Refresh();
|
|
|
|
/*
|
|
if(!RefreshRates())
|
|
{
|
|
Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),
|
|
", Ask=",DoubleToString(m_symbol.Ask(),Digits()));
|
|
return(INIT_FAILED);
|
|
}
|
|
*/
|
|
//--- tuning for 3 or 5 digits
|
|
|
|
int digits_adjust=1;
|
|
/*
|
|
if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
|
|
digits_adjust=10;
|
|
ExtStopLoss=InpStopLoss*m_symbol.Point()*digits_adjust;
|
|
*/
|
|
//---
|
|
if(!money.Init(GetPointer(m_symbol),Period(),m_symbol.Point()*digits_adjust))
|
|
return(INIT_FAILED);
|
|
money.Percent(Money_FixRisk_Percent); // 10% risk
|
|
//---
|
|
|
|
return(INIT_SUCCEEDED);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Expert deinitialization function |
|
|
//+------------------------------------------------------------------+
|
|
void OnDeinit(const int reason)
|
|
{
|
|
EventKillTimer();
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Timer function |
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
|
int check_pot(string name){
|
|
string name_bot,name_top;
|
|
name_bot=name+"_bot";
|
|
name_top=name+"_top";
|
|
|
|
double pricebot_low= ObjectGetDouble(0,name_bot,OBJPROP_PRICE,1);
|
|
double pricebot_top= ObjectGetDouble(0,name_bot,OBJPROP_PRICE,0);
|
|
|
|
double pricetop_low= ObjectGetDouble(0,name_top,OBJPROP_PRICE,1);
|
|
double pricetop_top= ObjectGetDouble(0,name_top,OBJPROP_PRICE,0);
|
|
|
|
|
|
double pot=(pricetop_top-pricebot_low)/_Point;
|
|
|
|
//Alert(price_low+" "+price_top);
|
|
return pot;
|
|
}
|
|
|
|
int find_point(ENUM_TIMEFRAMES timefr, string bt="top", int sh=1){
|
|
double high2, open1, close2, open2, close1,price,low2;
|
|
int sh2,i;
|
|
|
|
for(i=1;i<100;i++){
|
|
|
|
sh=i;
|
|
sh2=sh+1;
|
|
high2=iHigh(NULL,timefr,sh2);
|
|
low2=iLow(NULL,timefr,sh2);
|
|
open1=iOpen(NULL,timefr,sh);
|
|
close2=iClose(NULL,timefr,sh2);
|
|
open2=iOpen(NULL,timefr,sh2);
|
|
close1=iClose(NULL,timefr,sh);
|
|
|
|
//time=iTime(NULL,timefr,sh2);
|
|
//time=sh2;
|
|
price=close2;
|
|
if(close2>open2 && high2>open1 && open1>close1 && bt=="top")
|
|
break;
|
|
if(close2<open2 && low2<open1 && open1<close1 && bt=="bot")
|
|
break;
|
|
//if(bt=="bot")break;
|
|
|
|
}
|
|
return sh2;
|
|
}
|
|
|
|
string find_enter(){
|
|
string out="null";
|
|
double high2, open1, close2, open2, close1,price,low2;
|
|
int sh2,sh;
|
|
sh2=2;
|
|
sh=1;
|
|
ENUM_TIMEFRAMES timefr=PERIOD_M5;
|
|
|
|
high2=iHigh(NULL,timefr,sh2);
|
|
low2=iLow(NULL,timefr,sh2);
|
|
open1=iOpen(NULL,timefr,sh);
|
|
close2=iClose(NULL,timefr,sh2);
|
|
open2=iOpen(NULL,timefr,sh2);
|
|
close1=iClose(NULL,timefr,sh);
|
|
|
|
double pricetop_top=ObjectGetDouble(0,"orange_top",OBJPROP_PRICE,0);
|
|
double pricebot_low=ObjectGetDouble(0,"orange_bot",OBJPROP_PRICE,1);
|
|
double ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
|
|
double bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
|
|
if(high2>open1 && close2>open2 && close2>pricetop_top
|
|
&& open1>close1 && ask<pricetop_top && pricetop_top>close1 )out="sell";
|
|
|
|
if(low2<close1 && close2<open2 && close2<pricebot_low
|
|
&& open1<close1 && bid>pricebot_low && pricebot_low<close1 )out="buy";
|
|
|
|
|
|
return out;
|
|
|
|
}
|
|
|
|
void tant_kr(string name, string bt){
|
|
string com,name2;
|
|
int point;
|
|
double price, high2,high1,low2,low1,close2,start_price_tg,end_price_tg;
|
|
datetime time,start_date_tg,end_date_tg;
|
|
end_date_tg=TimeCurrent();
|
|
color col=clrDarkOrange;
|
|
ENUM_TIMEFRAMES per;
|
|
name2=name+"_"+bt;
|
|
if(name=="orange"){
|
|
per=PERIOD_H1;
|
|
col=clrDarkOrange;
|
|
}
|
|
if(name=="yellow"){
|
|
per=PERIOD_H4;
|
|
col=clrYellow;
|
|
}
|
|
if(name=="blue"){
|
|
per=PERIOD_D1;
|
|
col=clrDarkTurquoise;
|
|
}
|
|
if(bt=="top"){
|
|
point=find_point(per);
|
|
}
|
|
if(bt=="bot"){
|
|
point=find_point(per,"bot");
|
|
}
|
|
time=iTime(NULL,per,point);
|
|
close2=iClose(NULL,per,point);
|
|
high2=iHigh(NULL,per,point);
|
|
high1=iHigh(NULL,per,point-1);
|
|
low2=iLow(NULL,per,point);
|
|
low1=iLow(NULL,per,point-1);
|
|
if(high1>high2)high2=high1;
|
|
if(low1<low2)low2=low1;
|
|
|
|
start_date_tg=time;
|
|
start_price_tg=high2;
|
|
end_price_tg=close2;
|
|
if(bt=="bot"){
|
|
start_price_tg=close2;
|
|
end_price_tg=low2;
|
|
}
|
|
com+=time+" "+close2+" "+high2;
|
|
//Alert(point);
|
|
Rect.Create(0,name2,0,start_date_tg,start_price_tg,end_date_tg,end_price_tg);
|
|
Rect.Color(col);
|
|
Rect.Fill(true);
|
|
|
|
}
|
|
void OnTimer()
|
|
{
|
|
//---
|
|
|
|
int order_buy_c=0,order_sell_c=0;
|
|
long buy_id,sell_id;
|
|
ulong ticket;
|
|
//string type;
|
|
uint total=PositionsTotal();
|
|
//Alert(total);
|
|
//--- пройдем в цикле по всем ордерам
|
|
for(uint i=0;i<total;i++)
|
|
{
|
|
//--- получим тикет ордера по его позиции в списке
|
|
if((ticket=PositionGetTicket(i))>0)
|
|
{
|
|
//--- получим свойства ордера
|
|
|
|
// type =EnumToString(ENUM_ORDER_TYPE(OrderGetInteger(ORDER_TYPE)));
|
|
//--- подготовим и выведем информацию об ордере
|
|
// Alert(PositionGetInteger(POSITION_TYPE));
|
|
if(PositionGetInteger(POSITION_TYPE)==1){
|
|
order_sell_c++;
|
|
sell_id=PositionGetInteger(POSITION_IDENTIFIER);
|
|
}
|
|
else{ order_buy_c++;
|
|
buy_id=PositionGetInteger(POSITION_IDENTIFIER);
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
string com="";
|
|
tant_kr("orange","top");
|
|
tant_kr("blue","top");
|
|
tant_kr("yellow","top");
|
|
|
|
tant_kr("orange","bot");
|
|
tant_kr("blue","bot");
|
|
tant_kr("yellow","bot");
|
|
com=check_pot("orange");
|
|
com+="y-"+check_pot("yellow")+"b-"+check_pot("blue");
|
|
Comment(com);
|
|
//Alert("222");
|
|
double lastday_top,lastday_bot,lot2;
|
|
int high=iHighest(NULL,period,MODE_HIGH,days,0);
|
|
int low=iLowest(NULL,period,MODE_LOW,days,0);
|
|
|
|
// iLowest(
|
|
//iHighest(
|
|
// lastday_top=iHigh(NULL,PERIOD_H4,high);
|
|
// lastday_bot=iLow(NULL,PERIOD_H4,low);
|
|
|
|
lastday_top=iHigh(NULL,period,high)+SymbolInfoInteger(NULL,SYMBOL_SPREAD)*_Point+20*_Point;
|
|
|
|
lastday_bot=iLow(NULL,period,low)-20*_Point;
|
|
|
|
if(find_enter()=="sell" && order_sell_c==0){
|
|
lot2=money.CheckOpenShort(SymbolInfoDouble(NULL,SYMBOL_BID),lastday_top);
|
|
trade.Sell(lot2,NULL,SymbolInfoDouble(NULL,SYMBOL_BID),lastday_top);
|
|
trade.PositionClose(buy_id);
|
|
}
|
|
|
|
if(find_enter()=="buy"
|
|
&& order_buy_c==0
|
|
){
|
|
lot2=money.CheckOpenLong(SymbolInfoDouble(NULL,SYMBOL_ASK),lastday_bot);
|
|
trade.Buy(lot2,NULL,SymbolInfoDouble(NULL,SYMBOL_ASK),lastday_bot);
|
|
//trade.PositionModify(trade.ResultDeal(),fibo_bottom);
|
|
trade.PositionClose(sell_id);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
//+------------------------ |