получив на этот момент мин и мах с графиков М1 и Н4 выставлять на графике D1
мин макс за какой период? предыдущей свечи, за несколько свечей или что то другое?
получив на этот момент мин и мах с графиков М1 и Н4 выставлять на графике D1
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double ZZPrice(string s,int n=0)
{
double zz=0;
int k=0;
for(int i=0; i<1111; i++)
{
zz=iCustom(s,0,"ZigZag",12,5,3,0,i);
if(zz!=0)
{
k++;
if(k>n)
return(zz);
}
}
return(0);
}
и алерт когда цена коснется нижней (красной) линии сверху.
И так что бы на одной свече алертил один раз. Тоесть если следующая свеча тоже коснулась линии, то снова алерт. А если одна и таже свеча ходит туда сюда, то только один, первый раз касания.
наиболее серьёзный «прокол» это исполнение срока опциона, такое впечатление, что он это делает когда вздумается, может сработать раз нормально, потом 5 минутку закрыть через 15 минут, потом опять нормально, а в следующий раз ордер может зависнуть вообще на час, скажем???!!!
//+------------------------------------------------------------------+
//| MALimit.mq5 |
//| Copyright 2020, AM2 |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, AM2"
#property link "http://www.forexsystems.biz"
#property version "1.00"
#include <Trade\Trade.mqh> // Подключаем торговый класс CTrade
//--- Inputs
input double Lots = 0.1; // лот
input double KLot = 1; // умножение лота
input double MaxLot = 5; // максимальный лот
input int StopLoss = 2000; // лось
input int TakeProfit = 50; // язь
input int BULevel = 0; // уровень БУ
input int BUPoint = 30; // пункты БУ
input int TrailingStop = 200; // трал
input int MAPeriod = 800; // период МА
input int Expiration = 10; // истечение ордеров
input int Slip = 30; // реквот
input int Shift = 1; // на каком баре сигнал индикатора
input int Magic = 123; // магик
input double Level1 = 100; //
input double Level2 = 161.8; //
input double Level3 = 255; //
input double Level4 = 500; //
input double Level5 = 1250; //
int ma;
double pr[1];
CTrade trade; // Используем торговый класс CTrade
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
ma=iMA(NULL,0,MAPeriod,0,0,0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Trailing()
{
double tp=0,sl=0;
double Ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
double Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
if(PositionSelect(_Symbol))
{
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
{
if(Bid-PositionGetDouble(POSITION_PRICE_OPEN)>TrailingStop*_Point)
{
if(PositionGetDouble(POSITION_SL)<Bid-TrailingStop*_Point)
{
sl = Bid-TrailingStop*_Point;
tp = PositionGetDouble(POSITION_PRICE_OPEN)+TakeProfit*_Point;
trade.PositionModify(_Symbol,sl,tp);
}
}
}
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
{
if(PositionGetDouble(POSITION_PRICE_OPEN)-Ask>TrailingStop*_Point)
{
if((PositionGetDouble(POSITION_SL)>(Ask+TrailingStop*_Point)) || (PositionGetDouble(POSITION_SL)==0))
{
sl=Ask+TrailingStop*_Point;
tp=PositionGetDouble(POSITION_PRICE_OPEN)-TakeProfit*_Point;
trade.PositionModify(_Symbol,sl,tp);
}
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void BU()
{
double Ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
double Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
double sl=0,tp=0;
for(int i=PositionsTotal()-1; i>=0; i--)
{
if(PositionSelect(_Symbol))
{
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
{
if(PositionGetDouble(POSITION_PRICE_OPEN)<=Bid-BULevel*_Point)
{
if(PositionGetDouble(POSITION_PRICE_OPEN)>PositionGetDouble(POSITION_SL))
{
sl = PositionGetDouble(POSITION_PRICE_OPEN)+BUPoint*_Point;
tp = PositionGetDouble(POSITION_PRICE_OPEN)+TakeProfit*_Point;
trade.PositionModify(_Symbol,sl,tp);
}
}
}
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
{
if(PositionGetDouble(POSITION_PRICE_OPEN)>=Ask+BULevel*_Point)
{
if(PositionGetDouble(POSITION_SL)>PositionGetDouble(POSITION_PRICE_OPEN))
{
sl = PositionGetDouble(POSITION_PRICE_OPEN)-BUPoint*_Point;
tp = PositionGetDouble(POSITION_PRICE_OPEN)-TakeProfit*_Point;
trade.PositionModify(_Symbol,sl,tp);
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountOrders(ENUM_ORDER_TYPE type)
{
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(OrderGetTicket(i)))
{
if(OrderGetInteger(ORDER_TYPE)==type)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double Bid=SymbolInfoDouble(NULL,SYMBOL_BID);
CopyBuffer(ma,0,0,1,pr);
if(BULevel>0)
BU();
if(TrailingStop>0)
Trailing();
if(PositionsTotal()<1)
{
if(CountOrders(2)<1)
{
if(Bid<pr[0] && Bid>pr[0]-Level1*_Point && Level1>0)
trade.BuyLimit(Lots,pr[0]-Level1*_Point,NULL,pr[0]-Level1*_Point-StopLoss*_Point,pr[0]-Level1*_Point+TakeProfit*_Point,ORDER_TIME_DAY,TimeCurrent()+Expiration*3600,"");
if(Bid<pr[0] && Bid>pr[0]-Level2*_Point && Level2>0)
trade.BuyLimit(Lots,pr[0]-Level2*_Point,NULL,pr[0]-Level2*_Point-StopLoss*_Point,pr[0]-Level2*_Point+TakeProfit*_Point,ORDER_TIME_DAY,TimeCurrent()+Expiration*3600,"");
if(Bid<pr[0] && Bid>pr[0]-Level3*_Point && Level3>0)
trade.BuyLimit(Lots,pr[0]-Level3*_Point,NULL,pr[0]-Level3*_Point-StopLoss*_Point,pr[0]-Level3*_Point+TakeProfit*_Point,ORDER_TIME_DAY,TimeCurrent()+Expiration*3600,"");
if(Bid<pr[0] && Bid>pr[0]-Level4*_Point && Level4>0)
trade.BuyLimit(Lots,pr[0]-Level4*_Point,NULL,pr[0]-Level4*_Point-StopLoss*_Point,pr[0]-Level4*_Point+TakeProfit*_Point,ORDER_TIME_DAY,TimeCurrent()+Expiration*3600,"");
if(Bid<pr[0] && Bid>pr[0]-Level5*_Point && Level5>0)
trade.BuyLimit(Lots,pr[0]-Level5*_Point,NULL,pr[0]-Level5*_Point-StopLoss*_Point,pr[0]-Level5*_Point+TakeProfit*_Point,ORDER_TIME_DAY,TimeCurrent()+Expiration*3600,"");
}
if(CountOrders(3)<1)
{
if(Bid>pr[0] && Bid<pr[0]+Level1*_Point && Level1>0)
trade.SellLimit(Lots,pr[0]+Level1*_Point,NULL,pr[0]+Level1*_Point+StopLoss*_Point,pr[0]+Level1*_Point-TakeProfit*_Point,ORDER_TIME_DAY,TimeCurrent()+Expiration*3600,"");
if(Bid>pr[0] && Bid<pr[0]+Level2*_Point && Level2>0)
trade.SellLimit(Lots,pr[0]+Level2*_Point,NULL,pr[0]+Level2*_Point+StopLoss*_Point,pr[0]+Level2*_Point-TakeProfit*_Point,ORDER_TIME_DAY,TimeCurrent()+Expiration*3600,"");
if(Bid>pr[0] && Bid<pr[0]+Level3*_Point && Level3>0)
trade.SellLimit(Lots,pr[0]+Level3*_Point,NULL,pr[0]+Level3*_Point+StopLoss*_Point,pr[0]+Level3*_Point-TakeProfit*_Point,ORDER_TIME_DAY,TimeCurrent()+Expiration*3600,"");
if(Bid>pr[0] && Bid<pr[0]+Level4*_Point && Level4>0)
trade.SellLimit(Lots,pr[0]+Level4*_Point,NULL,pr[0]+Level4*_Point+StopLoss*_Point,pr[0]+Level4*_Point-TakeProfit*_Point,ORDER_TIME_DAY,TimeCurrent()+Expiration*3600,"");
if(Bid>pr[0] && Bid<pr[0]+Level5*_Point && Level5>0)
trade.SellLimit(Lots,pr[0]+Level5*_Point,NULL,pr[0]+Level5*_Point+StopLoss*_Point,pr[0]+Level5*_Point-TakeProfit*_Point,ORDER_TIME_DAY,TimeCurrent()+Expiration*3600,"");
}
}
Comment("\n MA: ",pr[0],
"\n Sell Limit: ",CountOrders(3),
"\n Total: ",OrdersTotal());
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
но не могу понять за что отвечает число 11?
1. Сейчас алертит не при касании ценой линии, а только когда цена пробьёт линию на 2п.-3п.
а нужно что бы алерт был сразу при касании линии.
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int FindSignal()
{
int qua=0;
for(int i=1; i<=1000; i++)
{
if(iCustom(NULL,0,IndName,11,0,i)>0)//blue-buy
{
qua=1;
break;
}
if(iCustom(NULL,0,IndName,11,1,i)>0)//red-sell
{
qua=2;
break;
}
}
return(qua);
}
Здравствуйте, сегодня при тестированию советника в журнале много выводится ошибок.
Скрин прилагаю.
//+------------------------------------------------------------------+
//| Candle.mq4 |
//| Copyright 2020, AM2 |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, AM2"
#property link "http://www.forexsystems.biz"
#property version "1.00"
#property strict
#property indicator_chart_window
input datetime Start = D'30.04.2020';
input datetime Stop = D'1.04.2020';
input int iHour = 23;
input int iMinute = 30;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
Comment("");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
int all=0;
int days=0;
int day_all=0;
datetime tm=0;
int bulls=0,bears=0;
string s="";
int end=iBarShift("",0,Stop);
int begin=iBarShift("",0,Start);
datetime day1=iTime(NULL,PERIOD_D1,1);
datetime day2=iTime(NULL,PERIOD_D1,2);
// считаем общее число свечей на промежутке
for(int i=begin; i<end; i++)
{
all++;
}
// считаем общее число свечей внутри дня
for(int i=iBarShift(NULL,0,day1); i<iBarShift(NULL,0,day2); i++)
{
day_all++;
}
// считаем общее число дней на заданном промежутке
days=(int)(all/day_all);
// цикл по свечам внутри дня
for(int i=0; i<day_all; i++)
{
if(close[i]>open[i])
{
bulls++;
tm=time[i];
for(int k=0; k<all; k++)
{
if(close[k]>open[k] && tm==time[k])
bulls++;
}
if(bulls==days-1)
{
s+="\n"+(string)bulls+" Bulls "+(string)tm;
bulls=0;
}
}
if(close[i]<open[i])
{
bears++;
tm=time[i];
for(int k=0; k<all; k++)
{
if(close[k]<open[k] && tm==time[k])
bears++;
}
if(bears==days-1)
{
s+="\n"+(string)bulls+" Bears "+(string)tm;
bears=0;
}
}
}
Comment("\n Days: ",days,
"\n All Candles: ",all,
"\n Day Candles: ",day_all,
"\n Bulls Candles: ",bulls,
"\n Bears Candles: ",bears,
"\n ",s);
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
AM2