extern int Level2 = 50;
Появилась отложка, определили в каком направлении и какой тип. Sel Limit, sell stop. buy limit, buy stop. Выбрали звуковой файл выставили алерт по этой цене, ждем. Сняли ордер, озвучка, мол такой тип ордера снят, по такому инструменты. (Озвучки на делаю.)
//+------------------------------------------------------------------+
//| Vinin.mq4 |
//| Copyright 2021, AM2 |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, AM2"
#property link "http://www.forexsystems.biz"
#property version "1.00"
#property strict
//--- Inputs
extern double Lots = 0.1; // лот
extern double KLot = 2; // умножение лота
extern double MaxLot = 5; // максимальный лот
extern int StopLoss = 500; // лось
extern int TakeProfit = 0; // язь
extern int TrailingStop = 25; // трал
extern int Slip = 30; // реквот
extern int Shift = 2; // бар индикатора
extern int CloseSig = 1; // 1-закрытие по сигналу
extern int Magic = 123; // магик
extern string IndName = "FractalZigZagNoRepaint";
extern bool CalculateOnBarClose = true;
extern int ZZDepth = 12;
extern int ZZDev = 5;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
extern string IndName2 = "VininI_MA_WPR(v1)";
extern int WPR_Period = 60;
extern int MA_Period = 50;
extern int WPR_Period2 = 14;
extern int MA_Period2 = 10;
extern int Limit = 1440;
extern int Level = 50;
extern int Level2 = 50;
datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Comment("");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
{
int r=0;
color clr=Green;
double sl=0,tp=0;
if(type==1 || type==3 || type==5)
{
clr=Red;
if(StopLoss>0)
sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
if(TakeProfit>0)
tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
}
if(type==0 || type==2 || type==4)
{
clr=Blue;
if(StopLoss>0)
sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
if(TakeProfit>0)
tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
}
r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,0,clr);
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountTrades()
{
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()<2)
count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Lot()
{
double lot=Lots;
if(CountTrades()>0)
lot=NormalizeDouble(Lots*MathPow(KLot,CountTrades()),2);
if(lot>MaxLot)
lot=Lots;
return(lot);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
{
bool cl;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==0 && (ot==0 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slip,White);
}
if(OrderType()==1 && (ot==1 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slip,White);
}
}
}
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Trailing()
{
bool mod;
double sl=0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY)
{
if(Bid-OrderOpenPrice()>TrailingStop*_Point)
{
sl=NormalizeDouble(Bid-TrailingStop*_Point,_Digits);
if(OrderStopLoss()<sl)
{
Print("SL: ",sl, " TP: ",OrderTakeProfit());
mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
return;
}
}
}
if(OrderType()==OP_SELL)
{
if(OrderOpenPrice()-Ask>TrailingStop*_Point)
{
sl=NormalizeDouble(Ask+TrailingStop*_Point,_Digits);
if(OrderStopLoss()>sl || (OrderStopLoss()==0))
{
Print("SL: ",sl, " TP: ",OrderTakeProfit());
mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
return;
}
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double lim = iCustom(NULL,0,IndName,CalculateOnBarClose,ZZDepth,ZZDev,0,Shift);
double red = iCustom(NULL,0,IndName,CalculateOnBarClose,ZZDepth,ZZDev,1,Shift);
double vin = iCustom(NULL,0,IndName2,WPR_Period,MA_Period,Limit,0,Shift);
double vin21 = iCustom(NULL,0,IndName2,WPR_Period2,MA_Period2,Limit,0,Shift);
double vin22 = iCustom(NULL,0,IndName2,WPR_Period2,MA_Period2,Limit,0,Shift+1);
bool buy = lim!=EMPTY_VALUE && vin<-Level && vin21<-Level2;
bool sell = red!=EMPTY_VALUE && vin>Level && vin21>Level2;
if(TrailingStop>0)
Trailing();
if(t!=Time[0])
{
if(buy)
{
PutOrder(0,Ask);
}
if(sell)
{
PutOrder(1,Bid);
}
t=Time[0];
}
if(CloseSig>0)
{
if(vin21<Level2 && vin22>Level2)
{
CloseAll(0);
}
if(vin21>-Level2 && vin22<-Level2)
{
CloseAll(1);
}
}
Comment("\n lime: ",lim,
"\n red: ",red);
}
//+------------------------------------------------------------------+
не то что я хотелвот допустим идет зеленая гребенка вверх, вам хочется чтобы при появлении красного столбика открыли сделку, но в реальности сразу может появиться сразу 3-10 красных столбиков.
… стоповые ордера на СЕЛЛ не должны удаляться при появлении сигнала на БАЙ.
Они (не рыночный) удаляются при повторном сигнале этого же направления. И следующим ордером происходит усреднение рыночного ордера.
Пример: была сетка стоповых селл 0.01; 0.02 — 0.05. Имеем опять сигнал СЕЛЛ. Остаётся ордер 0.01 и удаляются стоповые. выставляется усредняющий селл с увеличением или коэффициентом.
Число начальных отложенных ордеров сетки на графике, пожалуйста, сделайте ограниченным. И пусть они добавляются по мере продвижения цены без ограничения их количества (число текущих отложек).
Индюк, походу, перерисовываетсярисует сильно. прогоните в тестере и увидите
1. стрелка
2. большой впр ниже своего минус уровня
3. малый впр ниже своего минус уровня
закрытие бай: малый впр пересек верхний уровень сверху вниз
AM2