0
OK!
avatar

droba

  • 19 августа 2021, 07:34
0
Вот скрин. Старался сделать как можно подробнее, если что, то будем уточнять.

avatar

droba

  • 6 июля 2021, 17:29
0
А свой советник посмотри чтоб вспомнить алгоритм работы и всё станет ясно.
avatar

droba

  • 4 июля 2021, 15:50
0
Андрей, на скринах не получиться показать. Вот минутное видео youtu.be/wl6JLhXqelc более наглядно.
Это твой советник. В нем надо только переделать, чтобы ордера открывались на каждой свече и советник находил самый убыточный ордер и трали ТР в отрицательную зону до его закрытия. Вот ссылка на твой советник BuySell60.mq4 zakaz.opentraders.ru/59302.html. Мы с тобой уже начали работать по этой теме её надо довести до логического конца.

Или можно прямо сюда:
//+------------------------------------------------------------------+
//| BuySell60.mq4 |
//| Copyright 2021, AM2 |
//| www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright «Copyright 2021, AM2»
#property link «www.forexsystems.biz»
#property version «1.00»
#property strict

//--- Inputs
extern double Lot = 1; // лот позы
extern double BTake = 0.6; // умножение тейка buy
extern double STake = 0.6; // умножение тейка sell
extern int ATR = 14; // ATR
extern int Slip = 30; // реквот
extern int Magic = 123; // магик

double atr=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---

//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountTrades(int type)
{
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)
count++;
}
}
}
return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Mode(double take)
{
bool m=1;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==0)
{
m=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderOpenPrice()-(OrderOpenPrice()-Bid)*take,0,Yellow);
}
if(OrderType()==1)
{
m=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderOpenPrice()+(Bid-OrderOpenPrice())*take,0,Yellow);
}
}
}
}
}
//+------------------------------------------------------------------+
//| Результат последней сделки |
//+------------------------------------------------------------------+
int LastDealResult()
{
int result=0;
if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderProfit()>0)
{
result=1;//tp
}
if(OrderProfit()<0)
{
result=2;//sl
}
}
}
return(result);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int r=0;
atr=iATR(NULL,0,ATR,0);

if(CountTrades(0)<1 && Close[1]>Open[1])
{
if(LastDealResult()==1)
Mode(BTake);
r=OrderSend(NULL,0,Lot,NormalizeDouble(Ask,_Digits),Slip,0,NormalizeDouble(Bid+atr,_Digits),"",Magic,0,Blue);
}

if(CountTrades(1)<1 && Close[1]<Open[1])
{
if(LastDealResult()==1)
Mode(STake);
r=OrderSend(NULL,1,Lot,NormalizeDouble(Bid,_Digits),Slip,0,NormalizeDouble(Ask-atr,_Digits),"",Magic,0,Red);
}

Comment("\n ATR: ",NormalizeDouble(atr,_Digits));
}
//+------------------------------------------------------------------+
avatar

droba

  • 2 июля 2021, 07:38
0
Я же не прошу его редактировать или еще что то просто посмотрите как он работает и мне надо примерно тоже самое.
avatar

droba

  • 6 июня 2021, 18:14
0
Андрей, а Вы смотрели как работает советник который я Вам отправлял. Он сам обновляет сетку фибо выставленную в ручную. Выставляет ордера в нужную сторону по сетке фибо. Выставляет ТР и SL там где надо. Нужно только сделать модификацию ордеров.
4. Модификация рыночных ордеров:
а) Если цена закрытия свечи выше уровня ноль, то все ордера переносим в без убыток на уровень 23.6;
б) Если Low свечи коснулся уровня 76.4 (в случае Buy) или High (в случае Sell), то ордера закрываются на последующих уровнях
(как пример, ордер открывшийся на уровне 61.8 закрывается на уровне 50.0 и т.д.).
Это просто как пример в дополнение к ТЗ.
avatar

droba

  • 6 июня 2021, 17:45
0
Андрей, по моему Фибо всегда натягивается с лева на право это в трейдинге так принято по умолчанию.
Если импульс бычий ноль в верху сто в низу, ну и для медвежьего импульса соответственно наоборот.
И к стати на скрине показано как натягивается фибо.
avatar

droba

  • 4 июня 2021, 19:19
0
Я не сторонник ТР и SL выставлять в пунктах. Всё должно быть по рынку, импульс ТР равен величине импульса, SL выставляется там где ожидаем смену тренда.
И любая стратегия строится по логике импульс, коррекция, вход, ТР, SL.
avatar

droba

  • 4 июня 2021, 06:56
0
Я так понял в независимости от направления рынка, т.е. тренд бычий или медвежий он открывает BUY если уровень пересекает с низу в верх и если уровень пересекает с верху в низ то SELL. Что то хрень какая та ни какого анализа. Фибо должно натягиваться по тренду. А в коде наверно это реализовать сложно, поэтому я и оставил вариант установки фибо вручную. А что в коде нельзя что ли прописать смену нуля (ну когда торгуем вверх ноль в низу, когда в низ — ноль в верху), а я бы сетку переворачивал в ручную не удаляя её.
avatar

droba

  • 4 июня 2021, 06:43
0
Вот этот — www.opentraders.ru/downloads/2279/
Только сетку буду натягивать сам.
И вот в этом сове цикл фибо реализован не плохо.
Я его уже маленько подправил изменил ТП на большее мозгов не хватает.

#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);
}
}
avatar

droba

  • 3 июня 2021, 06:08
0
Да сетка ставиться в ручную.
Есть код такого советника, если надо могу сбросить, для примера.
avatar

droba

  • 2 июня 2021, 05:20
0
Вячеслав, Ваш вариант ближе к цели. Единственно хотелось бы модифировать процент от полученного профита и для Buy свой процент, и для Sell свой процент. Это необходимо в случае просадки.
avatar

droba

  • 23 мая 2021, 22:08
0
Андрей, на скрине отрыты два ордера Buy и Sell не один по ТП не закрылся откуда у Sell тейкпрофит смодифицировался, т.е. в дальнейшем Sell закроется с минусом, а ведь мог закрыться с плюсом.
Противоположный ордер модифицируем только после положительного ТП. Смысл стратегии вначале взяли потом отдали процент от полученной прибыли.
avatar

droba

  • 23 мая 2021, 21:27
0
Вячеслав, а Вы как поняли?
avatar

droba

  • 21 мая 2021, 22:39
0

В итоге получили шесть профитов Sell ордеров, а модификация Buy прошла один раз от первого профита Sell.
А в идеале ТР Байки должен тралиться после каждого ТП ордера Sell и на развороте Байка бы закрылась с минусов в итоге от серии сделок получили 70% прибыли ну минус своп. Смысл такой в начале взяли потом отдали процент от прибыли.
У меня в принципе так же работает модификация вот поэтому и обратился за помощью. Но я не программист.
avatar

droba

  • 21 мая 2021, 22:08
0
Вы программист?
avatar

droba

  • 21 мая 2021, 11:47
0
1. Можно на каждой свече.
2. Да только два ордера Buy и SELL без доливок.
avatar

droba

  • 21 мая 2021, 07:32
0

Если свеча бычья значит открываем BUY. Если свеча медвежья значит открываем SELL.
В рынке одновременно могут находиться только два разнонаправленных ордера Buy и SELL.

//+------------------------------------------------------------------+
double signal()
{
double sig=3;
if(Close[1]>Open[1] && Bid>=High[1] && Bid<High[1]+60*Point)
{
sig=0;
}
if(Close[1]<Open[1] && Ask<=Low[1] && Ask>Low[1]-60*Point)
{
sig=1;
}
return(sig);
}
avatar

droba

  • 21 мая 2021, 05:44