//+------------------------------------------------------------------+
//| DayFibo.mq4 |
//| Copyright 2022, Ve |
//| kupiscript@yandex.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, Ve"
#property link "kupiscript@yandex.ru"
#property version "1.00"
#property strict
extern int CandleHeight =200; // мин. размер свечи
extern double Lots = 0.01; // Лот
extern int TakeProfit = 200; // Тейк
extern int StopLoss = 600; // Лось
extern int Slip = 10; // Проскальзывание
extern bool Del = true; // Удалять вчерашние ордера
extern int Magic = 0; // Magic
//----------------------------------------------
double L_423,L_0,L_100,Delta;
datetime CandleTime;
double values[]={0.0, 0.382, 0.618, 1, 1.618, 2.618, 4.263};
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
{
int r=0;
color clr=Lime;
double tp=0,sl=0;
if(type==1 || type==3 || type==5)
{
clr=Red;
if(TakeProfit>0)
tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
if(StopLoss>0)
sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
}
if(type==0 || type==2 || type==4)
{
clr=Blue;
if(TakeProfit>0)
tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
if(StopLoss>0)
sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
}
r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"DayFibo",Magic,0,clr);
return;
}
//+------------------------------------------------------------------+
//| NewBar |
//+------------------------------------------------------------------+
bool NewCandle()
{
if(CandleTime==iTime(NULL,PERIOD_D1,0))
return false;
else
{
CandleTime=iTime(NULL,PERIOD_D1,0);
return true;
}
}
//+------------------------------------------------------------------+
//| Подсчет рыночных ордеров |
//+------------------------------------------------------------------+
int CountTrades(int type=-1)
{
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==type || (OrderType()<2 && type==-1))
count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров |
//+------------------------------------------------------------------+
void DelOrder()
{
bool del;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()>1)
del=OrderDelete(OrderTicket());
}
}
}
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double high=iHigh(NULL,PERIOD_D1,1);
double low=iLow(NULL,PERIOD_D1,1);
double open=iOpen(NULL,PERIOD_D1,1);
double close=iClose(NULL,PERIOD_D1,1);
datetime t1=iTime(NULL,PERIOD_D1,1);
datetime t2=iTime(NULL,PERIOD_D1,1);
bool candle_delta=MathAbs(high-low)>=CandleHeight*_Point;
//------------------------------------------------------
if(NewCandle() && candle_delta)
{
if(open>close || open<close)
{
If(Del) DelOrder();
FiboLevelsCreate(t1,open>close?low:high,t2,open>close?high:low,open>close?clrDodgerBlue:clrSandyBrown);
}
//---------------------------------------------------
if(ObjectFind(0,"FiboLevels")==0 && CountTrades()<1)
{
L_0=ObjectGetDouble(0,"FiboLevels",OBJPROP_PRICE,1);
L_100=ObjectGetDouble(0,"FiboLevels",OBJPROP_PRICE,0);
Delta=MathAbs(L_0-L_100);
if(L_100<L_0 && CountTrades(2)<1)
{
L_423=NormalizeDouble(L_0-(Delta*4.236),_Digits);
PutOrder(2,L_423);
}
if(L_100>L_0 && CountTrades(3)<1)
{
L_423=NormalizeDouble(L_0+(Delta*4.236),_Digits);
PutOrder(3,L_423);
}
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Cоздает "Уровни Фибоначчи" по заданным координатам |
//+------------------------------------------------------------------+
bool FiboLevelsCreate(datetime time1,double price1,datetime time2,double price2,color colors)
{
long chart_ID=0; // ID графика
string name="FiboLevels"; // имя объекта
int sub_window=0; // номер подокна
color clr=clrYellow; // цвет объекта
ENUM_LINE_STYLE style=STYLE_DASH; // стиль линии объекта
int width=1; // толщина линии объекта
bool back=false; // на заднем плане
bool ray_right=true; // продолжение объекта вправо
int levels=ArraySize(values);
//--- сбросим значение ошибки
ResetLastError();
if(ObjectFind(0,name)!=-1)
ObjectDelete(chart_ID,name);
//--- создадим "Уровни Фибоначчи" по заданным координатам
ObjectCreate(chart_ID,name,OBJ_FIBO,sub_window,time1,price1,time2,price2);
//--- установим цвет
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) режим продолжения отображения объекта вправо
ObjectSetInteger(chart_ID,name,OBJPROP_RAY_RIGHT,ray_right);
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
ObjectSetInteger(chart_ID,name,OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS);
//--- установим количество уровней
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels);
//--- установим свойства уровней в цикле
for(int i=0;i<levels;i++)
{
//--- значение уровня
ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]);
//--- цвет уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors);
//--- стиль уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,style);
//--- толщина уровня
ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,width);
//--- описание уровня
ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
}
ChartRedraw();
return(true);
}
#define TurnOf "\\Include\\Controls\\res\\Turn.bmp" //13x13
#define TurnOn "\\Include\\Controls\\res\\Restore.bmp" //13x13
ObjectDelete(0,"Turn");
verta81