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

 
Vladimir Gribachev:

Ну так на сервере MetaQuotes-Demo (где тестит модератор) мин. стоп левел нормально возвращается. Проверьте сами, 0 - не будет.

Я не знаю на каком сервере тестит модератор но у топик стартера стояла проверка на стоп левел и ему продукт вернули на доработку из за ошибки 130. Почитайте ветку с самого начала. 
 
Vitalii Ananev:
Я не знаю на каком сервере тестит модератор но у топик стартера стояла проверка на стоп левел и ему продукт вернули на доработку из за ошибки 130. Почитайте ветку с самого начала. 

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

Проверку лучше делать непосредственно при отправке или модификации сл-тп.

 
Vladimir Gribachev:

Вопрос, а зачем ставить на реале стоп-лосс в 1 пункт?

Только что вспомнил... Когда-то тестировал такой алгоритм с мин. стоп-лосом, проверка в принципе такая-же и никаких ошибок не было как и профита.

Продавец 60 продуктов маркета -- написавший в местном фрилансе 80 задач -- имеющий сайт с рекламой по написанию советников -- и всё это далеко не первый год -- это топикстартер.

И вдруг топикстартер спрашивает, что делать с нулевым стоплевелем и говорит, что модераторы маркета как-то странно проверяют советники маркета.

В противовес его комментариям -- форумчане, имеющие опыт разработок, имеющие опыт выставления продуктов в маркет -- читают его комментарии и недоумевают.

Как по мне -- топикстартер в откровенном неадеквате и тупо высосал из пальца проблему.

 
Andrey F. Zelinsky:

Продавец 60 продуктов маркета -- написавший в местном фрилансе 80 задач -- имеющий сайт с рекламой по написанию советников -- и всё это далеко не первый год -- это топикстартер.

И вдруг топикстартер спрашивает, что делать с нулевым стоплевелем и говорит, что модераторы маркета как-то странно проверяют советники маркета.

В противовес его комментариям -- форумчане, имеющие опыт разработок, имеющие опыт выставления продуктов в маркет -- читают его комментарии и недоумевают.

Как по мне -- топикстартер в откровенном неадеквате и тупо высосал из пальца проблему.

может просто общения захотелось? ) программирование ботов очень одинокое занятие
 
lilita bogachkova:

тут размещенный код:

double point=SymbolInfoDouble(symToWorkmodify,SYMBOL_POINT);
int spread=(ask-bid)/point;

Так делить на point нельзя, значение функции SymbolInfoDouble(symToWorkmodify,SYMBOL_POINT) может быть равным нулю.
Это касается и других маркет-функций. 

К примеру, из-за  использования в расчетах AccountInfoInteger(ACCOUNT_LEVERAGE) на чемпионате 2010 года вылетела часть советников с ошибкой Zero divide, когда в OnInit'е эта функция вернула 0.

 
Vladimir Gribachev:

Вопрос, а зачем ставить на реале стоп-лосс в 1 пункт?

Только что вспомнил... Когда-то тестировал такой алгоритм с мин. стоп-лосом, проверка в принципе такая-же и никаких ошибок не было как и профита.

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

Чтобы пояснить суть проблемы, привожу эксперт, проверка стопов в котором сделана по Вашему алгоритму:

#property strict
//--- input parameters
input int      i_slSize          = 10;
input int      i_tpSize          = 10;
input int      i_magicNumber     = 32847623;

int OnInit()
{
   Print("Величина стоплевел: ", MarketInfo(_Symbol,MODE_STOPLEVEL));
   return(INIT_SUCCEEDED);
}

int GetExpertOrderTicket()
{
   for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS))          
         continue;
         
      if (OrderSymbol() != Symbol())
         continue;   
         
      if (OrderMagicNumber() != i_magicNumber)
         continue;
         
      if (OrderType() == OP_BUY)
         return OrderTicket();
   }
   
   return -1;
}

void OnTick()
{
   int ticket = GetExpertOrderTicket();
   if (ticket < 0)
   {
      ticket = OrderSend(Symbol(), OP_BUY, 0.01, Ask, 30, 0.0, 0.0, NULL, i_magicNumber);
      return;
   }
      
   if (!OrderSelect(ticket, SELECT_BY_TICKET) || OrderCloseTime() != 0 || OrderStopLoss() > 0.0 || OrderTakeProfit() > 0.0)
      return;
      
   double SL=NormalizeDouble(OrderOpenPrice()-MathMax(i_slSize,(int)MarketInfo(_Symbol,MODE_STOPLEVEL))*_Point,_Digits);
   double TP=NormalizeDouble(OrderOpenPrice()+MathMax(i_tpSize,(int)MarketInfo(_Symbol,MODE_STOPLEVEL))*_Point,_Digits);
   
   bool result = OrderModify(ticket, 0.0, SL, TP, 0);
}

Результат тестирования такого эксперта:

0       14:52:30.354    Expert CheckStopLevel EURUSD,H1: removed
0       14:52:30.372    Expert CheckStopLevel EURUSD,H1: loaded successfully
0       14:52:30.390    Tester: template 'D:\ForexDC\Alpari\templates\tester.tpl' applied
0       14:52:30.395    TestGenerator: current spread 10 used
2       14:52:32        2015.01.12 00:00  CheckStopLevel inputs: i_slSize=10; i_tpSize=10; i_magicNumber=32847623; 
0       14:52:32        2015.01.12 00:00  CheckStopLevel EURUSD,H1: Величина стоплевел: 0.0
2       14:52:32        2015.01.12 00:00  CheckStopLevel EURUSD,H1: open #1 buy 0.01 EURUSD at 1.18674 ok
3       14:52:35        2015.01.12 00:00  CheckStopLevel EURUSD,H1: OrderModify error 130
3       14:52:35        2015.01.12 00:00  CheckStopLevel EURUSD,H1: OrderModify error 130
3       14:52:35        2015.01.12 00:00  CheckStopLevel EURUSD,H1: OrderModify error 130
3       14:52:35        2015.01.12 00:00  CheckStopLevel EURUSD,H1: OrderModify error 130
3       14:52:35        2015.01.12 00:00  CheckStopLevel EURUSD,H1: OrderModify error 130
3       14:52:35        2015.01.12 00:00  CheckStopLevel EURUSD,H1: OrderModify error 130
3       14:52:35        2015.01.12 00:00  CheckStopLevel EURUSD,H1: OrderModify error 130
3       14:52:35        2015.01.12 00:00  CheckStopLevel EURUSD,H1: OrderModify error 130
3       14:52:35        2015.01.12 00:00  CheckStopLevel EURUSD,H1: OrderModify error 130
3       14:52:35        2015.01.12 00:00  CheckStopLevel EURUSD,H1: OrderModify error 130
3       14:52:36        2015.01.12 00:00  CheckStopLevel EURUSD,H1: OrderModify error 130

Как видно, способ не проходит элементарную проверку.

 
Ihor Herasko:

Зрите в корень. Речь не о том, зачем ставить стоплосс 1 пункт. Речь о том, что ...

Если зрить в корень -- то надо различать: а) "защиту от дурака покупателя разработчика" и б) расчёт на то, что покупатель идиот. Это разные защиты. 

Никакой вменяемый покупатель не будет ставить тейк и стоп отрицательный. Поэтому проверка "как среагирует советник на отрицательный стоп и тейк" -- это расчёт на то, что покупатель идиот.

Создание советника в котором заданный пользователем тейк и стоп принудительно увеличивается постоянно на непонятную величину "2 спреда" -- это "защита от дурака", только защита непокупкой продукта от "дурака разработчика".

Особенно, если разработчик ставит такую защиту, чтобы пройти модерацию маркета.

 
Andrey F. Zelinsky:

Если зрить в корень -- то надо различать: а) "защиту от дурака покупателя разработчика" и б) расчёт на то, что покупатель идиот. Это разные защиты. 

Никакой вменяемый покупатель не будет ставить тейк и стоп отрицательный. Поэтому проверка "как среагирует советник на отрицательный стоп и тейк" -- это расчёт на то, что покупатель идиот.

Создание советника в котором заданный пользователем тейк и стоп принудительно увеличивается постоянно на непонятную величину "2 спреда" -- это "защита от дурака", только защита непокупкой продукта от "дурака разработчика". 

А в думаете тут много вменяемых? :) Особенно среди покупателей
 
Ihor Herasko:

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

Чтобы пояснить суть проблемы, привожу эксперт, проверка стопов в котором сделана по Вашему алгоритму:

Результат тестирования такого эксперта:

Как видно, способ не проходит элементарную проверку.

Если все так плохо то вот

#property strict
//--- input parameters
input int      i_slSize          = 10;
input int      i_tpSize          = 10;
input int      i_magicNumber     = 32847623;

int OnInit()
{
   Print("Величина стоплевел: ", MarketInfo(_Symbol,MODE_STOPLEVEL));
   return(INIT_SUCCEEDED);
}

int GetExpertOrderTicket()
{
   for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS))          
         continue;
         
      if (OrderSymbol() != Symbol())
         continue;   
         
      if (OrderMagicNumber() != i_magicNumber)
         continue;
         
      if (OrderType() == OP_BUY)
         return OrderTicket();
   }
   
   return -1;
}

void OnTick()
{
   int ticket = GetExpertOrderTicket();
   if (ticket < 0)
   {
      ticket = OrderSend(Symbol(), OP_BUY, 0.01, Ask, 30, 0.0, 0.0, NULL, i_magicNumber);
      return;
   }
      
   if (!OrderSelect(ticket, SELECT_BY_TICKET) || OrderCloseTime() != 0 || OrderStopLoss() > 0.0 || OrderTakeProfit() > 0.0)
      return;
      
   double SL=NormalizeDouble(Bid-MathMax(i_slSize,(int)MarketInfo(_Symbol,MODE_STOPLEVEL))*_Point,_Digits);
   double TP=NormalizeDouble(Bid+MathMax(i_tpSize,(int)MarketInfo(_Symbol,MODE_STOPLEVEL))*_Point,_Digits);
   
   bool result = OrderModify(ticket, 0.0, SL, TP, 0);
}

 журнал

2016.03.16 15:09:35.611 GBPUSD,H1: 94 tick events (1095 bars, 286082 bar states) processed in 0:00:06.037 (total time 0:00:10.109)
2016.03.16 15:09:35.611 2016.03.01 00:12  Tester: order #14 is closed
2016.03.16 15:09:35.588 2016.03.01 00:12  Tester: stop button pressed
2016.03.16 15:09:35.547 2016.03.01 00:12  abcd GBPUSD,H1: modify #14 buy 0.01 GBPUSD at 1.39165 sl: 1.39130 tp: 1.39154 ok
2016.03.16 15:09:35.483 2016.03.01 00:12  abcd GBPUSD,H1: open #14 buy 0.01 GBPUSD at 1.39165 ok
2016.03.16 15:09:35.483 2016.03.01 00:12  Tester: take profit #13 at 1.39144 (1.39144 / 1.39165)
2016.03.16 15:09:35.099 2016.03.01 00:12  abcd GBPUSD,H1: modify #13 buy 0.01 GBPUSD at 1.39156 sl: 1.39120 tp: 1.39144 ok
2016.03.16 15:09:35.035 2016.03.01 00:11  abcd GBPUSD,H1: open #13 buy 0.01 GBPUSD at 1.39156 ok
2016.03.16 15:09:35.035 2016.03.01 00:11  Tester: stop loss #12 at 1.39148 (1.39135 / 1.39156)
2016.03.16 15:09:34.971 2016.03.01 00:11  abcd GBPUSD,H1: modify #12 buy 0.01 GBPUSD at 1.39171 sl: 1.39148 tp: 1.39172 ok
2016.03.16 15:09:34.907 2016.03.01 00:11  abcd GBPUSD,H1: open #12 buy 0.01 GBPUSD at 1.39171 ok
2016.03.16 15:09:34.907 2016.03.01 00:11  Tester: take profit #11 at 1.39143 (1.39150 / 1.39171)
2016.03.16 15:09:34.267 2016.03.01 00:10  abcd GBPUSD,H1: modify #11 buy 0.01 GBPUSD at 1.39147 sl: 1.39119 tp: 1.39143 ok
2016.03.16 15:09:34.203 2016.03.01 00:10  abcd GBPUSD,H1: open #11 buy 0.01 GBPUSD at 1.39147 ok
2016.03.16 15:09:34.203 2016.03.01 00:10  Tester: stop loss #10 at 1.39132 (1.39126 / 1.39147)
2016.03.16 15:09:33.947 2016.03.01 00:10  abcd GBPUSD,H1: modify #10 buy 0.01 GBPUSD at 1.39174 sl: 1.39132 tp: 1.39156 ok
2016.03.16 15:09:33.883 2016.03.01 00:10  abcd GBPUSD,H1: open #10 buy 0.01 GBPUSD at 1.39174 ok
2016.03.16 15:09:33.883 2016.03.01 00:10  Tester: stop loss #9 at 1.39157 (1.39153 / 1.39174)
2016.03.16 15:09:33.435 2016.03.01 00:09  abcd GBPUSD,H1: modify #9 buy 0.01 GBPUSD at 1.39186 sl: 1.39157 tp: 1.39181 ok
2016.03.16 15:09:33.371 2016.03.01 00:09  abcd GBPUSD,H1: open #9 buy 0.01 GBPUSD at 1.39186 ok
2016.03.16 15:09:33.371 2016.03.01 00:09  Tester: take profit #8 at 1.39163 (1.39165 / 1.39186)
2016.03.16 15:09:32.603 2016.03.01 00:06  abcd GBPUSD,H1: modify #8 buy 0.01 GBPUSD at 1.39173 sl: 1.39139 tp: 1.39163 ok
2016.03.16 15:09:32.539 2016.03.01 00:06  abcd GBPUSD,H1: open #8 buy 0.01 GBPUSD at 1.39173 ok
2016.03.16 15:09:32.539 2016.03.01 00:06  Tester: take profit #7 at 1.39152 (1.39152 / 1.39173)
2016.03.16 15:09:32.346 2016.03.01 00:06  abcd GBPUSD,H1: modify #7 buy 0.01 GBPUSD at 1.39173 sl: 1.39128 tp: 1.39152 ok
2016.03.16 15:09:32.282 2016.03.01 00:06  abcd GBPUSD,H1: open #7 buy 0.01 GBPUSD at 1.39173 ok
2016.03.16 15:09:32.282 2016.03.01 00:06  Tester: take profit #6 at 1.39148 (1.39152 / 1.39173)
2016.03.16 15:09:32.025 2016.03.01 00:05  abcd GBPUSD,H1: modify #6 buy 0.01 GBPUSD at 1.39155 sl: 1.39124 tp: 1.39148 ok
2016.03.16 15:09:31.961 2016.03.01 00:05  abcd GBPUSD,H1: open #6 buy 0.01 GBPUSD at 1.39155 ok
2016.03.16 15:09:31.961 2016.03.01 00:05  Tester: stop loss #5 at 1.39140 (1.39134 / 1.39155)
2016.03.16 15:09:31.249 2016.03.01 00:04  abcd GBPUSD,H1: modify #5 buy 0.01 GBPUSD at 1.39170 sl: 1.39140 tp: 1.39164 ok
2016.03.16 15:09:31.185 2016.03.01 00:04  abcd GBPUSD,H1: open #5 buy 0.01 GBPUSD at 1.39170 ok
2016.03.16 15:09:31.185 2016.03.01 00:04  Tester: take profit #4 at 1.39147 (1.39149 / 1.39170)
2016.03.16 15:09:30.801 2016.03.01 00:02  abcd GBPUSD,H1: modify #4 buy 0.01 GBPUSD at 1.39159 sl: 1.39123 tp: 1.39147 ok
2016.03.16 15:09:30.737 2016.03.01 00:01  abcd GBPUSD,H1: open #4 buy 0.01 GBPUSD at 1.39159 ok
2016.03.16 15:09:30.737 2016.03.01 00:01  Tester: take profit #3 at 1.39136 (1.39138 / 1.39159)
2016.03.16 15:09:30.481 2016.03.01 00:01  abcd GBPUSD,H1: modify #3 buy 0.01 GBPUSD at 1.39143 sl: 1.39112 tp: 1.39136 ok
2016.03.16 15:09:30.417 2016.03.01 00:01  abcd GBPUSD,H1: open #3 buy 0.01 GBPUSD at 1.39143 ok
2016.03.16 15:09:30.417 2016.03.01 00:01  Tester: stop loss #2 at 1.39126 (1.39122 / 1.39143)
2016.03.16 15:09:30.225 2016.03.01 00:00  abcd GBPUSD,H1: modify #2 buy 0.01 GBPUSD at 1.39156 sl: 1.39126 tp: 1.39150 ok
2016.03.16 15:09:30.161 2016.03.01 00:00  abcd GBPUSD,H1: open #2 buy 0.01 GBPUSD at 1.39156 ok
2016.03.16 15:09:30.161 2016.03.01 00:00  Tester: take profit #1 at 1.39135 (1.39135 / 1.39156)
2016.03.16 15:09:29.647 2016.03.01 00:00  abcd GBPUSD,H1: modify #1 buy 0.01 GBPUSD at 1.39148 sl: 1.39111 tp: 1.39135 ok
2016.03.16 15:09:29.583 2016.03.01 00:00  abcd GBPUSD,H1: open #1 buy 0.01 GBPUSD at 1.39148 ok
2016.03.16 15:09:29.583 2016.03.01 00:00  abcd GBPUSD,H1: Величина стоплевел: 12.0
2016.03.16 15:09:29.574 2016.03.01 00:00  abcd inputs: i_slSize=10; i_tpSize=10; i_magicNumber=32847623; 
2016.03.16 15:09:27.513 TestGenerator: current spread 21 used

и никаких проблем.

ну а если вообще все плохо, как правильно подметил Andrey F. Zelinsky

Ухудшать функционал советника только для того, чтобы пойти модерацию маркета -- это однозначная не адекватность.  

то можно приписать проверку на 130тую ошибку и прибавлять +1 к стопам. Но это вообще бредятина.
 
Maxim Dmitrievsky:
А в думаете тут много вменяемых? :) Особенно среди покупателей

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

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

А вот, если у разработчика проблемы со здравым смыслом -- это не исправляется.

Ухудшать функционал советника только для того, чтобы пойти модерацию маркета -- это однозначная не адекватность. 

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