Прошу написать советник по сетке ФИБО.
1. Натягиваем сетку Фибо, после чего советник открывает ордера на уровнях 38.2, 50.0, 61.8 на выбор трейдера (true, false).
2. StopLoss на уровне 100.0 +- Spred
3. TP = Ask + distan_Buy.
TP = Bid — distan_Sell.
distan_Buy = ur0 — ur100;
distan_Sell = ur100 — ur0; (это часть кода из существующего советника).
4. Модификация рыночных ордеров:
а) Если цена закрытия свечи выше уровня 100.0, то все ордера переносим в без убыток на уровень 23.6;
б) Если Low свечи коснулся уровня 76.4 (в случае Buy) или High (в случае Sell), то ордера закрываются на последующих уровнях
(как пример, ордер открывшийся на уровне 61.8 закрывается на уровне 50.0 и т.д.).
5. После перевода ордеров в без убыток натягиваем новую сетку и советник работает по новой сетке.
Комментарии (17)
сетка вручную ставится или как?
35 AM2 Сообщений: 16430 - Андрей
Есть код такого советника, если надо могу сбросить, для примера.
9 droba Автор Сообщений: 239 - Droba
35 AM2 Сообщений: 16430 - Андрей
Только сетку буду натягивать сам.
И вот в этом сове цикл фибо реализован не плохо.
Я его уже маленько подправил изменил ТП на большее мозгов не хватает.
#property copyright ""
#property link ""
#property version «1.1»
#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);
}
}
9 droba Автор Сообщений: 239 - Droba
35 AM2 Сообщений: 16430 - Андрей
1. советник сам ставит сетку при установке на график.
2. 0 должен быть внизу.
3. сетка должна называться Fibo, если будете удалять созданную.
4. при пересечении уровня открывается бай или селл, в зависимости вверх или вниз.
5. если уровень 0 он отключен.
вот от этого наброска можно плясать дальше.
35 AM2 Сообщений: 16430 - Андрей
9 droba Автор Сообщений: 239 - Droba
35 AM2 Сообщений: 16430 - Андрей
Если импульс бычий ноль в верху сто в низу, ну и для медвежьего импульса соответственно наоборот.
И к стати на скрине показано как натягивается фибо.
9 droba Автор Сообщений: 239 - Droba
И любая стратегия строится по логике импульс, коррекция, вход, ТР, SL. Редактирован: 4 июня 2021, 06:59
9 droba Автор Сообщений: 239 - Droba
35 AM2 Сообщений: 16430 - Андрей
4. Модификация рыночных ордеров:
а) Если цена закрытия свечи выше уровня ноль, то все ордера переносим в без убыток на уровень 23.6;
б) Если Low свечи коснулся уровня 76.4 (в случае Buy) или High (в случае Sell), то ордера закрываются на последующих уровнях
(как пример, ордер открывшийся на уровне 61.8 закрывается на уровне 50.0 и т.д.).
Это просто как пример в дополнение к ТЗ. Редактирован: 6 июня 2021, 18:51
9 droba Автор Сообщений: 239 - Droba
35 AM2 Сообщений: 16430 - Андрей
9 droba Автор Сообщений: 239 - Droba
35 AM2 Сообщений: 16430 - Андрей
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий