Проверка минимального стопа в советниках, публикуемых в маркете. - страница 17

 
Vladislav Andruschenko:

у меня эксперт ловит мин движения поэтому он долбит сервер, но не с 1 пунктом стоплосса, а с нормальный мин уровень+спред, но спред плавающий. Поэтому советник долбит сервер пока тот не вернет нормальный. не расширенный спред. 

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

Долбить сервер - нехорошая затея. Можно нарваться на запрет автоторговли. (кому нужен делец с DDOS атаками на сервер своим советником?)

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

А вот если после отсылки запроса при приемлемых размерах стопа опять получаем ошибку 130 (за время отсылки запроса изменились условия стоплевел), тогда можно ещё скорректировать размер стопа и отослать запрос (при приемлемых размерах вновь рассчитанного стопа). Количество таких запросов должно быть ограниченным, иначе - опять тупая долбёжка.

Теперь понятно почему вас не пропускают в маркете.

 

тут немного другая ситуация, 

долбить я не имел ввиду постоянная долбежка.

Естественно после ошибки стоят проверки на ошибку - Слип. но он в тестере не работает.

Дело тут в плавающем спреде

как я написал выше - перед отправкой запроса - уровни стопов корректируются и отправляются на сервер, - сервер возвращает ошибку 130 - эксперт опять корректирует уровень и опять отправляет на сервер.

и так далее.

в тестере Слип не работает поэтому задержки нет.

в данный момент решил проблему таким образом: стоп должен быть не меньше чем стопуровень на сервере + спред+1

Но!!! что делать если стоп уровень возвращается сервером в виде = 0 ? тоесть плавающим? как определить размер стопа?

Вариант - подкорректировать по ошибке 130 - не вариант - модератор не пропустит такой способ.

Как предлагали раньше = ошибка 130 - увеличиваем на 1 и так далее, пока сервер не пропустит сделку.  - не вариант. 

 

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

Спасибо всем за участие.  

 
Vladislav Andruschenko:

тут немного другая ситуация, 

долбить я не имел ввиду постоянная долбежка.

Естественно после ошибки стоят проверки на ошибку - Слип. но он в тестере не работает.

Дело тут в плавающем спреде

как я написал выше - перед отправкой запроса - уровни стопов корректируются и отправляются на сервер, - сервер возвращает ошибку 130 - эксперт опять корректирует уровень и опять отправляет на сервер.

и так далее.

в тестере Слип не работает поэтому задержки нет.

в данный момент решил проблему таким образом: стоп должен быть не меньше чем стопуровень на сервере + спред+1

Но!!! что делать если стоп уровень возвращается сервером в виде = 0 ? тоесть плавающим? как определить размер стопа?

Вариант - подкорректировать по ошибке 130 - не вариант - модератор не пропустит такой способ.

Как предлагали раньше = ошибка 130 - увеличиваем на 1 и так далее, пока сервер не пропустит сделку.  - не вариант. 

 

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

Спасибо всем за участие.  

В принципе, можно при стоплевел==0 заставлять пользователя вводить вручную коэффициент умножения спреда. Т.е., при инициализации (не переключении таймфрейма) проверять стоплевел и, если он нулевой, выводить запрос на ввод коэффициента. Если пользователь отказался от ввода, то использовать коэфф. 2 (спред*2) и далее при ошибке 130 увеличивать либо сам коэффициент, либо размер стопа. Если же пользователь знает как рассчитывается стоплевел (не поленился спросить у техподдержки в отделе дилинга например), то использовать введённый им коэффициент, не забывая всё же реагировать на 130-ю ошибку увеличением размера стопа (вдруг появится-таки). Но обычно (сталкивался несколько раз и вывел эмпирически), если использовать стоп=стоплевел*коэффициент+1, ошибок не появляется. Если не прибавлять 1 пункт, то ошибки появляются.

Соответственно, проверить на сервере МК как у них считается стоплевел и вписать нужный коэффициент в советник. Даже если модератор откажется вводить вручную коэффициент, то он будет введён автоматически.

 

Спасибо, по умолчанию и делал коэффициент 2 +1 пункт. 

а насчет спрашивать это мысль. создам форму, пусть вводит сам.  

 

Бывает брокер банит автоторговлю на пару минут, если послать без пауз около 20-ти команд.
То есть модифицировать/закрывать пачку ордеров надо с паузой хотя бы 300-500 мс между ордерами. (но там ошибка уже не 130)

 
MqlTick MS_MqlTick;

enum EnumStopLevel
  {
   a0 = 0, // Real StopLevel
   a1 = 1, // StopLevel correction spread
   a2 = 2, // StopLevel correction 2*spread
   a3 = 3, // StopLevel correction 3*spread
   a4 = 4, // StopLevel correction 4*spread      
   a5 = 5, // StopLevel correction 5*spread         
  };
input EnumStopLevel Mode_StopLevel = 0;


//========================================== StopLevFun
double StopLevFun(int Mode_StopLevelF)
{
   double StopLL = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL) * _Point;
 
   if(MQLInfoInteger(MQL_TESTER) && Mode_StopLevelF < 3) Mode_StopLevelF = 3; ///////////////////////// Это для тестера при модерации
 
   switch(Mode_StopLevelF)
   {
      case 0: break;
      case 1: While_SymbolInfoTick(_Symbol); StopLL = MathMax(MS_MqlTick.ask - MS_MqlTick.bid, StopLL); break;
      case 2: While_SymbolInfoTick(_Symbol); StopLL = MathMax((MS_MqlTick.ask - MS_MqlTick.bid) * 2, StopLL); break;
      case 3: While_SymbolInfoTick(_Symbol); StopLL = MathMax((MS_MqlTick.ask - MS_MqlTick.bid) * 3, StopLL); break;
      case 4: While_SymbolInfoTick(_Symbol); StopLL = MathMax((MS_MqlTick.ask - MS_MqlTick.bid) * 4, StopLL); break;
      case 5: While_SymbolInfoTick(_Symbol); StopLL = MathMax((MS_MqlTick.ask - MS_MqlTick.bid) * 5, StopLL); break;
   }
 
   return(NormalizeDouble(StopLL, _Digits) );   
}


//=========================================== While SymbolinfoTick
bool While_SymbolInfoTick(string Fsymbol)
{
   int WhTi = 0;
   
   while(!SymbolInfoTick(Fsymbol, MS_MqlTick) ) 
   {
      if(WhTi % 10 == 0) Print(Fsymbol, " >> SymbolInfoTick(Fsymbol, MS_MqlTick)= false     Try= ", WhTi);
      
      WhTi++;
      
      if(WhTi > 100) return(false);
      
      Sleep(10);
   }
   
   return(true);
}
А если вот такой вариант.
Если реал или демо, то по умолчанию выбирается вариант 0 Mode_StopLevelF, и в этом случае возвращается реальный стоплевел.
Но можно выбрать и коррекцию стоплевела спредом, с разным коэффициентом. При этом если стоплевел будет больше чем спред, то будет учитываться стоплевел.
А для тестера, при модерации, выбирается всегда режим не ниже 3 Mode_StopLevelF, в этом случае стоплевел будет больше спреда в 3 раза и больше.
П.С. Как пишет разработчик SymbolInfoTick  предпочтительнее чем SymbolInfoDouble для Ask и Bid.
https://www.mql5.com/ru/docs/marketinformation/symbolinfodouble
 
Vladislav Andruschenko:

Всем привет, друзья! 

есть такая особенность маркета: нужно проверять все значения на мин стоп.

Если значение переменной меньше чем мин стоп то присваивать мин стоп, чтоб не было ошибки 130.

Сейчас же в 90 % брокеров спред и минстоп плавающий и выдают 0 .

есть такая конструкция кода, присваивающая всем переменным значения мин стопа.  

 но она в маркете более не проходит, потому что теперь везде мин стоп = 0 ,

кто как справляется с этой бедой?

Привет Владислав, почитал проблему с которой тоже столкнулся, и принял решение если плавающий стоп уровень возвращает значение 0 или близок к нулю, то использовать обратные сигналы для закрытия.

Как думаешь такое решение нормально ? 

 
привет, а обратный сигнал к закрытию, в смысле виртуальные стопы? 
 
Да, но я по лучше тока вот придумал, так и сделаю. Например если авто расчёт стоп уровней по ATR вернул ноль или близко к значению ноль, которое меньше чем значение среднего спреда, то используем предыдущие данные, пока не появятся новые данные с открытием следующего ордера. Это лучше чем обратные сигналы.
 
это если делать систему - тогда все ок, но вопрос стоял именно по проверке в маркете, к сожалению ошибка 130 не дает продукту пройти дальше
Причина обращения: