Создатель сетки 1.1 - страница 3

 
Привет снова

спасибо за ваш ответ, я добавлю вас, когда вернусь домой
 
Я обнаружил, что у этого кода иногда возникают проблемы с сохранением идеальной сетки (по крайней мере, когда я запускаю его как сетку отката, а не прорыва). Я видел, как дыры формируются и не обновляются, и я видел, как сетка не полностью формируется иногда со всеми 10 ордерами. Кроме того, похоже, ему не нравятся очень короткие настройки времени обновления, и я не понимаю, почему. Кажется, что 15 минут - это слишком долго для обновления сетки (скорее 15 секунд!), так что это серьезная проблема. Я был бы признателен, если бы вы узнали, сталкивались ли вы с подобным. Тем не менее, вы отлично справились с этой задачей. Отличная работа.
 
Сома,

Вы правы, была ошибка, на которую мне кто-то указал, и, похоже, она исправлена. вот новая версия. Я также изменил интервал на 1 минуту - но я думаю, что 15-30 минут лучше... это позволит избежать нескольких встречных сделок, когда рынок движется очень быстро.

пожелания,

//+------------------------------------------------------------------+ //| MakeGrid.mq4 | //| Copyright © 2005, hdb | //| http://www.dubois1.net/hdb | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, hdb" #property link "http://www.dubois1.net/hdb" //#property version "1.4beta" extern string GridName = "Grid"; // идентифицирует сетку. позволяет использовать несколько сосуществующих сеток extern double Lots = 0.1; // extern double GridSize = 6; // пункты между ордерами - размер сетки или ячейки extern double GridSteps = 12; // общее количество ордеров для размещения extern double TakeProfit = 6 ; // количество тиков для фиксации прибыли. обычно = размер сетки, но вы можете переопределить extern double StopLoss = 0; // если хотите добавить стоп-лосс. обычные сетки не используют стоп-лоссы extern double UpdateInterval = 1; // обновление ордеров каждые x минут extern bool wantLongs = true; // нужны ли нам длинные позиции extern bool wantShorts = true; // нужны ли нам короткие позиции extern bool wantBreakout = true; // нужны ли нам лонги выше цены, шорты ниже цены extern bool wantCounter = true; // нужны ли нам лонги ниже цены, шорты выше цены extern bool limitEMA34 = false;      // хотим ли мы лонги только выше ema, шорты только ниже ema extern double LastUpdate = 0; // счетчик используется для записи времени последнего обновления extern double GridMaxOpen = 0; // максимальное количество открытых позиций //+------------------------------------------------------------------+ //| функция инициализации эксперта | //+------------------------------------------------------------------+ int init() { //---- #property show_inputs // показывает параметры - спасибо Slawa...    
 if ( TakeProfit <= 0 ) // { TakeProfit = GridSize; } //---- return(0); } //+------------------------------------------------------------------------+ //| тестирует наличие открытой позиции или ордера в области atRate | //| проверяет лонги, если checkLongs true, иначе проверяет | //| шорты | //+------------------------------------------------------------------------+ bool IsPosition(double atRate, double inRange, bool checkLongs ) { int totalorders = OrdersTotal();
     for(int j=0;j<totalorders;j++) // сканируем все ордера и позиции.... { OrderSelect(j, SELECT_BY_POS); if ( OrderSymbol()==Symbol() && OrderComment() == GridName )  // ищем только если mygrid и символ... { int type = OrderType(); if (MathAbs( OrderOpenPrice() - atRate ) < inRange) // ищем не точную цену, а ценовую близость (меньше размера сетки) { if ( ( checkLongs && ( type == OP_BUY || type == OP_BUYLIMIT || type == OP_BUYSTOP ) )  || (!checkLongs && ( type == OP_SELL || type == OP_SELLLIMIT || type == OP_SELLSTOP ) ) ) { return(true); } } } } } } 

   return(false); } //+------------------------------------------------------------------+ //| функция запуска скриптовой программы | //+------------------------------------------------------------------+ int start() { //---- int i, j,k, ticket, entermode, totalorders; bool doit; double point, startrate, traderate; //---- if (MathAbs(CurTime()-LastUpdate)> UpdateInterval*60) // мы обновляем при первом вызове и каждые UpdateInterval минут { LastUpdate = CurTime();
   Print("Updating"); point = MarketInfo(Symbol(),MODE_POINT); startrate = ( Ask + point*GridSize/2 ) / point / GridSize; // округляем до числа тиков, кратного GridSize k = startrate ; k = k * GridSize ; startrate = k * point - GridSize*GridSteps/2*point ;          // рассчитываем нижнюю точку входа double EMA34=iMA(NULL,0,34,0,MODE_EMA,PRICE_CLOSE,0); for( i=0;i<GridSteps;i++) { traderate = startrate + i*point*GridSize; if ( wantLongs && (!limitEMA34 || traderate > EMA34)) { if ( IsPosition(traderate,point*GridSize,true) == false )           // проверяем, нет ли у меня открытых ордеров вблизи моей цены: если да, ставим один { double myStopLoss = 0; if ( StopLoss > 0 ) { myStopLoss = traderate-point*StopLoss ; } if ( traderate > Ask ) { entermode = OP_BUYSTOP; } 
              else { entermode = OP_BUYLIMIT ; } 
              
              if ( ((traderate > Ask ) && (wantBreakout)) || ((traderate <= Ask ) && (wantCounter)) ) 

              { ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate+point*TakeProfit,GridName,16384,0,Green); } } } } if ( wantShorts && (!limitEMA34 || traderate < EMA34)) { if (IsPosition(traderate,point*GridSize,false)== false )           // проверяем, нет ли у меня открытых ордеров вблизи моей цены: если да, ставим один { myStopLoss = 0; if ( StopLoss > 0 ) { myStopLoss = traderate+point*StopLoss ; } if ( traderate > Bid ) { entermode = OP_SELLLIMIT; } 
              else { entermode = OP_SELLSTOP ; } 
              
              if ( ((traderate < Bid ) && (wantBreakout)) || ((traderate >= Bid ) && (wantCounter)) ) 
                { ticket=OrderSend(Symbol(),entermode,Lots,traderate,0,myStopLoss,traderate-point*TakeProfit,GridName,16384,0,Red); } } } } } } return(0); } //+------------------------------------------------------------------+
 
Спасибо, hdb. Но, возможно, я не совсем понимаю, как вы думаете о сетках, потому что я не вижу причин, по которым слишком быстрое обновление было бы плохо. Пропущенная запись не позволит сетке полностью раскрыть свой потенциал. Когда я запускаю ее вручную, я обновляю ордера, как только что-то меняется. Я управляю сетками откатов, а не прорывов, так что, возможно, в этом и заключается разница, но при откатах вы получаете прибыль от прерывистости, поэтому идеальным вариантом является отсутствие дыр в сетке.
 
Сома,

Да, возможно, вы правы... так что лучше всего было бы обновлять часто, но только несколько слотов сетки? Нужно протестировать. У меня нет твердого мнения.

реакция,
 
Я ждал благоприятного момента, чтобы опубликовать обновление сетки - поскольку ее производительность в последнее время была действительно паршивой.
На следующей неделе после моего последнего обновления я был в отпуске, и сетка была остановлена. На прошлой неделе сетка работала большую часть времени.
Я выключал ее несколько раз, когда маржа avail была нулевой, и устанавливал "только лонги" на большинстве мажоров.
Сегодня был день супер возвращения.

Баланс : 93 (+10 с 10 дней назад)
Использованная маржа : +15k
Доступная маржа : +28k
нереал. p&l : -49k (-11 с 10 дней назад)
Баланс : 44k

Чистый баланс на 1к хуже, чем 10 дней назад, и на 5к ниже начального баланса.

Самое сложное во всем этом - попытаться ограничить просадку. Я действительно должен найти способы сделать это!
 
Я думаю, что единственный способ избежать просадки - использовать дискреционные методы.
т.е. знать, когда прекратить добавлять ордера, а когда, как вы сделали, прекратить добавлять, скажем, короткие позиции.

Начал с баланса 100K после неудачного старта, когда использовал слишком большой размер лота и был вынужден закрыть много позиций.

Баланс: 97 594.19 Баланс около 2 недель назад 83k
Свободная маржа: 6 016.88
Плавающий P/L: -38 960.45 было так же плохо, как и -56k
Маржа: 52 616.86

последние пару дней были очень медленными, уровень маржи достигал 93%.

но теперь все мажоры, похоже, начали разворачиваться.
уровень маржи вернулся примерно к 130%
 
Согласен, darkstonexa, я думаю, что вы можете быть правы - но я тестирую несколько автоматических вариантов, основанных на ema и macd... Я не слишком оптимистичен.

У друга тоже есть один с запущенным стоплоссом... и он изо всех сил пытается удержаться на плаву! Хотя это действительно решает проблему просадки!

Тем временем, я очистил свои позиции - все позиции с сильным отрицательным процентом переноса и хорошо в убытке (несколько 100 пунктов) были закрыты.

Так что мои сетки теперь готовы к очередному удару по голове (маржинальный бакт до 430%)!
 
Ну, какие хорошие 2 дня у нас были... вчера моя сетка +5k в зелени (эквити было 54k, я начал с 49k) после нескольких недель довольно катастрофической торговли.

Повезло, что мы можем попробовать на демо-счетах!

Теперь, когда я вернулся в "разумное" положение, я настроил все валютные пары следующим образом:
1) торговать только в направлении положительного переноса интереса (если только процент не близок к 0, тогда делать это в обе стороны)
2) лонги только выше 34 ema, шорты только ниже 34 ema
3) для двусторонних валют используйте macd на 5-минутном графике, чтобы решить, лонг или шорт.

Посмотрим, что это даст!

ps. Хотелось бы, чтобы обратное тестирование работало!
 
Здравствуйте, hdb,

Я взял ваш советник на EURUSD, торгую в обе стороны на пробой.

Теперь я хотел бы спросить вас, если вы уже столкнулись со следующей проблемой:

Через некоторое время у меня появляется более одного ордера на некоторые из одних и тех же позиций сетки. Иногда их два, но я также видел 5 и более.

Насколько я понимаю код, на одной позиции сетки одновременно должен быть открыт только один ордер.

Я возился с преобразованием всех двойных значений в int перед сравнением, потому что в MQL2 я обнаружил похожую проблему при сравнении двойных значений.

Вы сталкивались с чем-то подобным?

С уважением,

Кори
Причина обращения: