208 lines
No EOL
14 KiB
MQL5
208 lines
No EOL
14 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 <Trade\PositionInfo.mqh>
|
|
#include <Expert\Money\MoneyFixedRisk.mqh>
|
|
//---
|
|
CChartObjectRectangle Rect;
|
|
CChartObjectFibo Fibo;
|
|
CTrade trade;
|
|
CSymbolInfo m_symbol;
|
|
CMoneyFixedRisk money;
|
|
CPositionInfo position;
|
|
|
|
|
|
//---
|
|
input datetime start_date = D'2018.11.15 20:46:00';
|
|
input datetime end_date = D'2018.11.15 20:50:00';
|
|
input double start_price = 1.13160;
|
|
input double end_price = 1.13240;
|
|
input ENUM_TIMEFRAMES trade_bar=PERIOD_H1;
|
|
input ENUM_TIMEFRAMES period=PERIOD_D1;
|
|
input int days = 2;
|
|
input double Money_FixRisk_Percent=0.5;
|
|
input double fibo_level=0.236;
|
|
//+------------------------------------------------------------------+
|
|
//| 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 |
|
|
//+------------------------------------------------------------------+
|
|
void OnTimer()
|
|
{
|
|
//---
|
|
string com;
|
|
Rect.Create(0,"Rectangle 1",0,start_date,start_price,end_date,end_price);
|
|
Rect.Color(clrYellow);
|
|
Rect.Fill(true);
|
|
|
|
double lastday_top,lastday_bot;
|
|
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);
|
|
lastday_bot=iLow(NULL,period,low);
|
|
|
|
// PrintFormat("Ошибка вызова iHighest(). Код ошибки=%d",GetLastError());
|
|
// StringToTime(
|
|
|
|
Fibo.Create(0,"fib",0,iTime(NULL,period,days-1),lastday_bot,TimeCurrent(),lastday_top);
|
|
Fibo.SetPoint(0,iTime(NULL,period,days),lastday_bot);
|
|
// Fibo.SetPoint(2,TimeCurrent(),lastday_top);
|
|
com+=" ";
|
|
com+=Fibo.LevelsCount();
|
|
// com+=" "+Fibo.GetDouble(OBJPROP_PRICE,Fibo.LevelValue(0));
|
|
double fibo_top,fibo_bottom, fibo236, fibo236top,fibo236bot;
|
|
|
|
fibo_top=Fibo.GetDouble(OBJPROP_PRICE,1);
|
|
fibo_bottom=Fibo.GetDouble(OBJPROP_PRICE,0);
|
|
//0.236
|
|
fibo236=(fibo_top-fibo_bottom)*fibo_level;
|
|
fibo236top=fibo_top-fibo236;
|
|
fibo236bot=fibo_bottom+fibo236;
|
|
|
|
fibo_bottom=fibo_bottom-Point()*20;
|
|
|
|
fibo_top=fibo_top+m_symbol.SpreadFloat()*Point()+Point()*20;
|
|
// Alert("l;");
|
|
|
|
// 100000
|
|
//com+=" "+Fibo.GetDouble(OBJPROP_PRICE,1);
|
|
com+=" "+Fibo.LevelValue(2);
|
|
com+=" "+fibo_top+" "+fibo_bottom+" "+fibo236+" "+fibo236top+" "+fibo236bot;
|
|
ChartRedraw();
|
|
|
|
double last_bar;
|
|
|
|
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);
|
|
|
|
}
|
|
}
|
|
}
|
|
com+=":"+order_buy_c+"-"+order_sell_c+"-"+buy_id;
|
|
|
|
last_bar=iOpen(NULL,trade_bar,1);
|
|
//money.Percent(Money_FixRisk_Percent);
|
|
com+="|"+money.CheckOpenShort(SymbolInfoDouble(NULL,SYMBOL_BID),fibo_top);
|
|
/*
|
|
if(money.ValidationSettings())
|
|
{
|
|
// Alert("AA");
|
|
|
|
}
|
|
*/
|
|
|
|
// Alert(SymbolInfoDouble(NULL,SYMBOL_BID));
|
|
// Alert(fibo_top);
|
|
//Alert(money.CheckOpenShort(SymbolInfoDouble(NULL,SYMBOL_BID),0));
|
|
|
|
|
|
Comment(SymbolsTotal(true),com);
|
|
double lot2=0.01;
|
|
string pos_com=trade_bar+" "+period+" "+fibo_level;
|
|
if(last_bar>fibo236top && fibo236top>iOpen(NULL,trade_bar,0)&& order_sell_c==0){
|
|
lot2=money.CheckOpenShort(SymbolInfoDouble(NULL,SYMBOL_BID),fibo_top);
|
|
if(lot2<0.01)lot2=0.01;
|
|
trade.Sell(lot2,NULL,SymbolInfoDouble(NULL,SYMBOL_BID),fibo_top,fibo_bottom,pos_com);
|
|
// trade.PositionClose(buy_id);
|
|
if(buy_id>0){
|
|
position.SelectByTicket(buy_id);
|
|
if(position.Profit()>0)
|
|
trade.PositionClose(buy_id);
|
|
}
|
|
}
|
|
|
|
if(last_bar<fibo236bot && fibo236bot<iOpen(NULL,trade_bar,0)
|
|
&& order_buy_c==0
|
|
){
|
|
lot2=money.CheckOpenLong(SymbolInfoDouble(NULL,SYMBOL_ASK),fibo_bottom);
|
|
if(lot2<0.01)lot2=0.01;
|
|
trade.Buy(lot2,NULL,SymbolInfoDouble(NULL,SYMBOL_ASK),fibo_bottom,fibo_top,pos_com);
|
|
if(sell_id>0){
|
|
position.SelectByTicket(sell_id);
|
|
if(position.Profit()>0)
|
|
trade.PositionClose(sell_id);
|
|
}
|
|
//trade.PositionModify(trade.ResultDeal(),fibo_bottom);
|
|
// trade.PositionClose(sell_id);
|
|
}
|
|
//if(PositionsTotal()==0)trade.Buy(1);
|
|
}
|
|
|
|
|
|
//+------------------------ |