droba
Droba

 
Уровень 7

  Торгую в компаниях:


Группа "Напишу исправлю советник индикатор MQL4"

Рейтинг 27



Прошу в советник добавить модификацию ордеров.

Есть советник работающий по сетке ФИБО. Уникальная логика работы.
Выставляется сетка ФИБО в ручную и далее советник делает всё сам обновляет сетку, выставляет ордера в нужном направлении,
выставляет ТР и SL.
Хотелось бы добавить в алгоритм советника модификацию ордеров.
— Модификация рыночных ордеров:
а) Если цена закрытия свечи выше уровня ноль, то все ордера переносим в без убыток на уровень 23.6;
б) Если Low свечи ниже уровня 76.4 (в случае Buy) или High выше уровня 76.4 (в случае Sell), то ордера закрываются на последующих уровнях
(как пример, ордер открывшийся на уровне 61.8 закрывается на уровне 50.0, открывшийся на 50.0 закрывается 38.2 и 38.2 на 23.6).



Советник прилагается:

//+------------------------------------------------------------------+
//| FIBO.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
#property version «1.2»
#property strict

extern int MAGICMA = 52453453;
//extern double inLot = 0.1;
input double RiskPercent = 2; //Риск на сделку
enum takeP {ur0, ur23};
enum stopL {ur76, ur100};
extern takeP lvlTP = ur0; // ТП уровень
extern stopL lvlSL = ur100; // СЛ уровень
extern bool thrdLvl = false; // Закрытие на следующем уровне

extern bool op_38 = true; // Открывать на уровне 38%?
extern bool op_50 = true; // Открывать на уровне 50%?
extern bool op_61 = true; // Открывать на уровне 61%?

string comment = StringConcatenate(«1 [»,Symbol()," / ",Period(),"]");
string name;
int res;

datetime timess = Time[1];
double ur0=0,ur23=0,ur38=0,ur50=0,ur61=0,ur76=0,ur100=0,SLur,TPur,distan_B=0,distan_S=0;
datetime urtm0, urtm100;
int lBar=0,is38=0,is50=0,is61=0;
int sord38=0,sord50=0,sord61=0,bord38=0,bord50=0,bord61=0;

//±-----------------------------------------------------------------+
void OnInit(){

OnTick();
}
//±-----------------------------------------------------------------+
void OnTick()
{
double Ppunkts = 0,Lpunkts = 0;
Comment("");
//Проверим что есть трендовая линия и она в единственном экземпляре:
if(ObjectsTotal(OBJ_FIBO)!=1){
Comment(" » Нарисуйте сетку Фибо!");
}else{
//Получим ИМЯ трендовой линии:
for(int i=0;i<ObjectsTotal();i++)
{name=ObjectName(i);
if(ObjectType(name)==OBJ_FIBO) break;}
//Print(name);
// Получим уровни сетки
double oldUr0 = ur0;
datetime oldUrtm0 = urtm0;
ur0 = NormalizeDouble(ObjectGet(name,OBJPROP_PRICE2),Digits);
ur100 = NormalizeDouble(ObjectGet(name,OBJPROP_PRICE1),Digits);
distan_B = ur0 — ur100;
distan_S = ur100 — ur0;
// urtm0 = ObjectGet(name,OBJPROP_TIME2);
// urtm100 = ObjectGet(name,OBJPROP_TIME1);
if(Bid > ur0 && ur0 > ur100){
ObjectSet(name, OBJPROP_PRICE2, Bid);
ObjectSet(name, OBJPROP_TIME2, Time[0]);
if(is38) ObjectDelete(0, name);
}
if(Ask < ur0 && ur0 < ur100){
ObjectSet(name, OBJPROP_PRICE2, Bid);
ObjectSet(name, OBJPROP_TIME2, Time[0]);
if(is38) ObjectDelete(0, name);
}
if(oldUr0 != ur0 || oldUrtm0 != urtm0 || oldUr0 == 0){
GetLevelsUr();
lBar = iBarShift(NULL,0,urtm0);
is38=0;is50=0;is61=0;
if(lvlTP == 0)TPur = ur0;
if(lvlTP == 1)TPur = ur23;
if(lvlSL == 0)SLur = ur76;
if(lvlSL == 1)SLur = ur100;
}
// Получаем бар на уровне 0
for(int i=lBar; i>=0; i--){
if(ur0 > ur100 && Bid < ur0){ // действие на покупки — восходящий фибо
// открытие ордеров на уровнях
if(Bid < ur38 && is38 == 0 && op_38){
bord38=OrderSend(Symbol(),OP_BUY,CalculateLot(Ask — (SLur — 30*Point)),Ask ,30,SLur — 30*Point,NormalizeDouble((Ask + distan_B),Digits) ,comment,MAGICMA,0,clrBlue);
is38 = 1;}
if(Bid < ur50 && is50 == 0 && op_50){
bord50=OrderSend(Symbol(),OP_BUY,CalculateLot(Ask — (SLur — 30*Point)),Ask ,30,SLur — 30*Point,NormalizeDouble((Ask + distan_B),Digits),comment,MAGICMA,0,clrBlue);
is50 = 1;}
if(Bid < ur61 && is61 == 0 && op_61){
bord61=OrderSend(Symbol(),OP_BUY,CalculateLot(Ask — (SLur — 30*Point)),Ask ,30,SLur — 30*Point,NormalizeDouble((Ask + distan_B),Digits),comment,MAGICMA,0,clrBlue);
is61 = 1;}
// закрытие ордеров на последующих уровнях
if(thrdLvl && Low[i] < ur76){
if(Ask > ur23 && is38){is38 = -1; if(OrderClose(bord38,OrderLots(),NormalizeDouble(Bid,Digits),3,clrRed))Print(«ордер закрыт»);}
if(Ask > ur38 && is50){is50 = -1; if(OrderClose(bord50,OrderLots(),NormalizeDouble(Bid,Digits),3,clrRed))Print(«ордер закрыт»);}
if(Ask > ur50 && is61){is61 = -1; if(OrderClose(bord61,OrderLots(),NormalizeDouble(Bid,Digits),3,clrRed))Print(«ордер закрыт»);}
}
// закрытие ордеров по TP
if(Ask > TPur){
if(is38>0){
is38 = -1;
ObjectDelete(0, name);
}
if(is50>0){
is50 = -1;
ObjectDelete(0, name);
}
if(is61>0){
is61 = -1;
ObjectDelete(0, name);
}
}
// закрытие ордеров по SL
if(Ask < SLur){ // цена ушла за пределы фибо — фиксируем убыток
ObjectDelete(0, name);
if(is38>0){
is38 = -1;
}
if(is50>0){
is50 = -1;
}
if(is61>0){
is61 = -1;
}
}
}
if(ur0 < ur100 && Low[i] > ur0){ // действие на продажи — нисходящий фибо
// открытие ордеров на уровнях
if(Ask > ur38 && is38 == 0 && op_38){
sord38=OrderSend(Symbol(),OP_SELL,CalculateLot((SLur + 30*Point) — Bid),Bid,30,SLur + 30*Point,NormalizeDouble((Bid — distan_S),Digits),comment,MAGICMA,0,clrRed);
is38 = 1;}
if(Ask > ur50 && is50 == 0 && op_50){
sord50=OrderSend(Symbol(),OP_SELL,CalculateLot((SLur + 30*Point) — Bid),Bid,30,SLur + 30*Point,NormalizeDouble((Bid — distan_S),Digits),comment,MAGICMA,0,clrRed);
is50 = 1;}
if(Ask > ur61 && is61 == 0 && op_61){
sord61=OrderSend(Symbol(),OP_SELL,CalculateLot((SLur + 30*Point) — Bid),Bid,30,SLur + 30*Point,NormalizeDouble((Bid — distan_S),Digits),comment,MAGICMA,0,clrRed);
is61 = 1;}
// закрытие ордеров на последующих уровнях
if(thrdLvl){
if(Bid < ur23 && is38){is38 = -1; if(OrderClose(sord38,OrderLots(),NormalizeDouble(Ask,Digits),3,clrRed))Print(«ордер закрыт»);}
if(Bid < ur38 && is50){is50 = -1; if(OrderClose(sord50,OrderLots(),NormalizeDouble(Ask,Digits),3,clrRed))Print(«ордер закрыт»);}
if(Bid < ur50 && is61){is61 = -1; if(OrderClose(sord61,OrderLots(),NormalizeDouble(Ask,Digits),3,clrRed))Print(«ордер закрыт»);}
}
// закрытие ордеров по TP
if(Bid < TPur){
if(is38>0){
ObjectDelete(0, name);
is38 = -1;
}
if(is50>0){
ObjectDelete(0, name);
is50 = -1;
}
if(is61>0){
ObjectDelete(0, name);
is61 = -1;
}
}
// закрытие ордеров по SL
if(Bid > SLur){ // цена ушла за пределы СЛ фибо — фиксируем убыток
ObjectDelete(0, name);
if(is38>0){
is38 = -1;
}
if(is50>0){
is50 = -1;
}
if(is61>0){
is61 = -1;
}
}
}
}
}
}
//±-----------------------------------------------------------------+
double CalculateLot(double _stop) {
double loss = _stop / MarketInfo(_Symbol, MODE_TICKSIZE) * MarketInfo(_Symbol, MODE_TICKVALUE);
double lots = AccountBalance() * RiskPercent / 100 / loss;
return (NormalizeDouble(MathMin(MarketInfo(_Symbol, MODE_MAXLOT), MathMax(MarketInfo(_Symbol, MODE_MINLOT), lots)), 2));
}
//±-----------------------------------------------------------------+
// обновление уровней при заданных 0 и 100
void GetLevelsUr(){
if(ur0 > ur100){
ur23 = NormalizeDouble(ur0-(ur0-ur100)*0.236,Digits);
ur38 = NormalizeDouble(ur0-(ur0-ur100)*0.382,Digits);
ur50 = NormalizeDouble(ur0-(ur0-ur100)*0.50,Digits);
ur61 = NormalizeDouble(ur0-(ur0-ur100)*0.618,Digits);
ur76 = NormalizeDouble(ur0-(ur0-ur100)*0.764,Digits);
}else{
ur23 = NormalizeDouble(ur0+(ur100-ur0)*0.236,Digits);
ur38 = NormalizeDouble(ur0+(ur100-ur0)*0.382,Digits);
ur50 = NormalizeDouble(ur0+(ur100-ur0)*0.50,Digits);
ur61 = NormalizeDouble(ur0+(ur100-ur0)*0.618,Digits);
ur76 = NormalizeDouble(ur0+(ur100-ur0)*0.764,Digits);
}
}
  • +4
  • Просмотров: 1177
  • 7 июня 2021, 06:18
  • droba
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Напишу исправлю советник индикатор MQL4", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Трал по стохастику
Следующая запись в группе  
Доработка советника
24 мая 2021
26 июня 2021

Комментарии (0)


Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари