Чего хочет валидатор? - страница 2

 
Konstantin Nikitin:

Да вопрос не в этом. Например у меня в 5-ке на ура проходит валидация. А в 4-ке при том-же коде и тех-же проверках, ни в какую не идет. Нет торговых позиций, и хоть лопни. Как уже говорили в другой теме, даже прямое взятие позиций писал и то нет позиций в 4-ке и все тут.
Так что скорее всего дело не в программистах реально.

P.S. А вообще всех с наступающим!!! В новом году уже нужно проблемы решать...

   Так я же открыл тему именно по той же причине. Но сразу после этого нашел нужное мне решение - вы, наверное не читали мой второй пост.
Мою проблему решает это:

//==================================== OnInit() ==========================================
int OnInit() {  
//------
   minLot=MarketInfo(Symbol(),MODE_MINLOT);
     lot=Lots;
       if(lot<minLot) lot=minLot;

 Нейтрализуется ввод нулевого значения объема во входящих параметрах.
Это как бы неправильно - пользователь впоследствии не сможет остановить робота вводом нулевого значения.
Если в роботе нет никаких других выключателей, то это станет большой проблемой при работе на мизерном депозите.
Нужно либо добавить какой-нить выключатель, либо писать это в OnTick проверив перед этим наличие сделок в истории.
Примерно так:

void OnTick() {  
//------
   double minLot=MarketInfo(Symbol(),MODE_MINLOT);
   int deals=checkHistory();
       if(deals==0 && lot<minLot) lot=minLot;

} //-- OnTick


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




 
Aleksey Semenov:
имея за плечами только кубасик и просмотрев шесть видеоуроков по мкл я сразу через месяц написал то что мне было нужно, никакой учебник я в глаза не видел, уровень вхождения на мкл4 настолько низкий на сколько это вообще возможно

Абсолютно с вами согласен. Даже знания обычного Бейсика вполне достаточно для того чтобы (имея мозги)  достаточно быстро освоить MQL4.
Для этого достаточно документации (давим F1) и че-нить что можно поломать/построить - берем что-то заведомо работоспособное, например код одного из роботов поставляемых вместе с терминалом.

 
Alexey Viktorov:

int распространяется только на (Lot/step) чтобы отбросить дробную часть если она будет.

Спасибо за ответ - вы меня опередили  ;)

Все именно так.
Самый простой способ проверки по шагу, это разделить проверяемый объем на минЛот,  а потом умножить минЛот на целочисленный результат деления.
Так примерно:

// Пример
double lot=0.1235486;
double minLot=0.01;
   lot=int(lot/minLot)*minLot;
// результат: lot=0.12;

Работает корректно, если у брокера совпадают значения минимального объема и шага изменения объема.
Это не всегда так. Например на центовых счетах Робофорекс минЛот=0.10 а шаг равен 0.01, т.е. 0.11 допустимое значение.
Поэтому правильно будет взять штатной функцией значение шага и в той же формуле заменить им значение minLot.

ЗЫ
Заранее прошу прощения, если я выше втулил какую-нить логическую или арифметическую ошибку - сегодня 1 января ;)

   С Новым Годом!



 
Programmer4896 Vasily Temchenko:

Спасибо за ответ - вы меня опередили  ;)

Все именно так.
Самый простой способ проверки по шагу, это разделить проверяемый объем на минЛот,  а потом умножить минЛот на целочисленный результат деления.
Так примерно:

Работает корректно, если у брокера совпадают значения минимального объема и шага изменения объема.
Это не всегда так. Например на центовых счетах Робофорекс минЛот=0.10 а шаг равен 0.01, т.е. 0.11 допустимое значение.
Поэтому правильно будет взять штатной функцией значение шага и в той же формуле заменить им значение minLot.

ЗЫ
Заранее прошу прощения, если я выше втулил какую-нить логическую или арифметическую ошибку - сегодня 1 января ;)

   С Новым Годом!

Так это только ваши интерпретации. В вопросе на который я отвечал чётко написано шаг лота, а минимальный лот это уже от вас лично.

   С Новым Годом!

 
Programmer4896 Vasily Temchenko:

   Так я же открыл тему именно по той же причине. Но сразу после этого нашел нужное мне решение - вы, наверное не читали мой второй пост.
Мою проблему решает это:

 Нейтрализуется ввод нулевого значения объема во входящих параметрах.
Это как бы неправильно - пользователь впоследствии не сможет остановить робота вводом нулевого значения.
Если в роботе нет никаких других выключателей, то это станет большой проблемой при работе на мизерном депозите.
Нужно либо добавить какой-нить выключатель, либо писать это в OnTick проверив перед этим наличие сделок в истории.
Примерно так:


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

Что уже только не экспериментировал. Даже с таким кидал в 4-ке не проходит

  #ifdef __MQL4__
     static int test_tester = 0;
     static bool test_bool = true;
     if( test_bool )
     if( MQLInfoInteger(MQL_TESTER) )
     {
          if( test_tester == 300 )
          {
               if(OrdersHistoryTotal() == 0)
                    if(OrdersTotal() == 0)
                         if( AccountFreeMarginCheck( _Symbol, OP_BUY, MarketInfo(_Symbol,MODE_MINLOT) ) > 0 )
                              if(OrderSend(_Symbol, OP_BUY, MarketInfo(_Symbol,MODE_MINLOT), Ask, 5, 0, 0, "", i_magic_number) < 0) test_bool = false;
          } else test_tester++;
     }
  #endif

У меня это в классе открытия позиций. Но даже в OnTick можно вставить и все равно ловиться ошибка, нет торговых операций.

 
Я то это понимаю. А компьютер понимает?
 
Konstantin Nikitin:

Что уже только не экспериментировал. Даже с таким кидал в 4-ке не проходит

У меня это в классе открытия позиций. Но даже в OnTick можно вставить и все равно ловиться ошибка, нет торговых операций.

Хорошо, верю что вы перепробовали все возможные и невозможные варианты. 
Но не вижу пробовали ли вы применить мою фишку: сказать в коде валидатору "Свободен, ты задаешь во входящих лот=0, а я говорю лот=0,01",
т.е. явно указать в коде что лот не может быть меньше минЛот, что бы ни было введено во входящих.

 
Aleksandr Morozov:
Я то это понимаю. А компьютер понимает?
Это о чем?
 
Programmer4896 Vasily Temchenko:

Хорошо, верю что вы перепробовали все возможные и невозможные варианты. 
Но не вижу пробовали ли вы применить мою фишку: сказать в коде валидатору "Свободен, ты задаешь во входящих лот=0, а я говорю лот=0,01",
т.е. явно указать в коде что лот не может быть меньше минЛот, что бы ни было введено во входящих.

Смотрите внимательно код!!!

if(OrderSend(_Symbol, OP_BUY, MarketInfo(_Symbol,MODE_MINLOT), Ask, 5, 0, 0, "", i_magic_number) < 0) test_bool = false;

Прежде чем писать пост ради поста.

 
Konstantin Nikitin:

Смотрите внимательно код!!!

Прежде чем писать пост ради поста.

Лишние посты мне здесь ни к чему - за это не платят.
2. Смотреть имеет смысл только полный код, а не отдельный фрагмент. Но это требует времени, изучать чужой код нахяляву не стану.
3. Если хотите найти где собачка порылась - напишите тестового робота объемом 50-70 строк - только безусловное открытие одной позиции по заданному во входящих  Lots. И больше ничего, кроме проверки объемов и шага. Если пройдет - добавлять постепенно остальные функции, пока не нарветесь на ошибку - станет понятно ГДЕ она происходит.
4. Если вам не интересны подсказки, то что вы вообще делаете в этой теме? Я ее вообще-то открывал с тем чтобы мне помогли.  Но свою проблему я уже давно решил сам - 3 робота поправил товарищу из Орска  и он их успешно опубликовал.