Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 1146

 
ребят объясните  пожалуйста почему при увелечении шага параметров  при оптимизации число проходов справа внизу терминала не уменьшается тобишь количество такое же как и при более детальной в чем может быть причина и время такое же как и при более подробной оптимизации вообщем шаг не помогает сократить время для оптимизации почему? и как ускорить вообще оптимизацию?
 

Господа, Приветствую!


Продолжительное время воюю с webrequest (get),сперва на mql4, теперь на mql5 ,периодически откладывая решение вопроса. 

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

Прошу помочь. Я почти готов заплатить за решение этой проблемы: представляете как далеко все зашло?))

Всем Успехов ! BugRiver

 

Как получить переменную типа string в советнике, если вызов длл функции возвращает только указатель на строку

const char *sqlite3_sql(sqlite3_stmt *pStmt)


  Ссылка на документацию

 
Valiantsin Karvat:

Господа, Приветствую!


Продолжительное время воюю с webrequest (get),сперва на mql4, теперь на mql5 ,периодически откладывая решение вопроса. 

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

Прошу помочь. Я почти готов заплатить за решение этой проблемы: представляете как далеко все зашло?))

Всем Успехов ! BugRiver

/// Для MQL 4
// url - адрес страницы сайта
// timeot - время в течении которого будет ожидаться ответ (мс)
// webData - сообщение-ответ на запрос т.е. данные страницы сайта в виде текста
// cut - количество отбрасываемых символов от начала сообщения-ответа
///
// Функция возвращает - true в случае, если удалось получить сообщение-ответ на запрос.
bool ReadURL(const string url, int timeout, string &webData, int cut)
{
   char
   myMessage[],
   webMessage[];
   string sWebTitle;
   if(url == NULL)
   {
      Print("URL: NULL");
      return false;
   }
   ResetLastError();
// метод HTTP, url-адрес, cookie, referer, таймаут, массив тела HTTP-сообщения, размер массива data[] в байтах, массив с данными ответа сервера, заголовки ответа сервера
   WebRequest("GET", url, NULL, NULL, timeout, myMessage, 0, webMessage, sWebTitle);
   if(ArraySize(webMessage) == 0)
   {
      Print("В качестве ответа получено пустое сообщение.");
      Print("URL: ", url);
      return false;
   }
   webData = CharArrayToString(webMessage, cut);
   Print("URL: ", url);
   Print("Title: ", sWebTitle);
   return true;
}
Потом из переменной в которую получили сообщение-ответ ищете с помощью текстовых функций необходимые данные. Сообщение-ответ предварительно лучше посмотреть в браузере т. е. зайти на нужную страницу и открыть исходный код страницы. Найти там нужные данные и написать в программе уникальный фильтр.

С Инвестингом не работал таким образом и думаю это будет проблематично. Они специально сделали свой сайт тормозным для тех у кого нет подписки. Поэтому лучше найти другой источник котировок для автоматического чтения из кода программы.

PS> В индюке нельзя вызвать WebRequest. Так что придётся организовать связь между индюком и советником или индюком и зацикленным скриптом, для доставки данных индюку.
 
 //ема переменая
     double ma = iCustom(NULL, 0, "EMA", MA_Period, Coef, MA_Shift, SetPrice, 0, 0); 
    // сси переменая 
     double bz = iCustom(NULL, 0, "Bollinger Squeeze v8", triggerType, stochPeriod_trigger1, cciPeriod_trigger2,rsiPeriod_trigger3,6,0);
    //фишер переменая 
     double fi = iCustom(NULL, 0, "Fischer11", RangePeriods, PriceSmoothing,IndexSmoothing, Left_Right, Up_Down, 0,0);
     
     if  (Ask == ma && bz > 0 && fi > Koof_H)
       {
       OrderSend(Symbol(), OP_BUY, 1, Ask, Slippage, Stoploss , TakeProfit, "", magic, 0, Lime);
      
        }
       if (Bid == ma && bz < 0 && fi < Koof_L)
       {
       OrderSend(Symbol(), OP_SELL, 1, Bid, Slippage, Stoploss , TakeProfit, "", magic, 0, Red);
       }
         

  зделал код, наверно лучше сказать пародию на код за пол дня учебы и изучения, выдает ошибку "return value of 'OrderSend' should be checked"

кто то может помочь разобраться? и подсказать как создать советник

 
evgen_gal:
 //ема переменая
     double ma = iCustom(NULL, 0, "EMA", MA_Period, Coef, MA_Shift, SetPrice, 0, 0); 
    // сси переменая 
     double bz = iCustom(NULL, 0, "Bollinger Squeeze v8", triggerType, stochPeriod_trigger1, cciPeriod_trigger2,rsiPeriod_trigger3,6,0);
    //фишер переменая 
     double fi = iCustom(NULL, 0, "Fischer11", RangePeriods, PriceSmoothing,IndexSmoothing, Left_Right, Up_Down, 0,0);
     
     if  (Ask == ma && bz > 0 && fi > Koof_H)
       {
       OrderSend(Symbol(), OP_BUY, 1, Ask, Slippage, Stoploss , TakeProfit, "", magic, 0, Lime);
      
        }
       if (Bid == ma && bz < 0 && fi < Koof_L)
       {
       OrderSend(Symbol(), OP_SELL, 1, Bid, Slippage, Stoploss , TakeProfit, "", magic, 0, Red);
       }
         

  зделал код, наверно лучше сказать пародию на код за пол дня учебы и изучения, выдает ошибку "return value of 'OrderSend' should be checked"

кто то может помочь разобраться? и подсказать как создать советник

Всё норм. Осталось почитать про функцию обработки ошибок и добавить в код.

https://www.mql5.com/ru/forum/64058

Функция обработки ошибок. Нужна помощь!
Функция обработки ошибок. Нужна помощь!
  • 2015.09.12
  • www.mql5.com
Как правильно использовать функцию обработки ошибок, чтобы при возникновении непреодолимой ошибки при отправки ордера, эксперт перестал делать запросы на отправку ордера.
 
Renat Akhtyamov:
Всё норм. Осталось почитать про функцию обработки ошибок и добавить в код.

Да не найдёт он ошибку, вы уж сразу подскажите:

 //ема переменая
 int result=-1;
     double ma = iCustom(NULL, 0, "EMA", MA_Period, Coef, MA_Shift, SetPrice, 0, 0); 
    // сси переменая 
     double bz = iCustom(NULL, 0, "Bollinger Squeeze v8", triggerType, stochPeriod_trigger1, cciPeriod_trigger2,rsiPeriod_trigger3,6,0);
    //фишер переменая 
     double fi = iCustom(NULL, 0, "Fischer11", RangePeriods, PriceSmoothing,IndexSmoothing, Left_Right, Up_Down, 0,0);
     
     if  (Ask == ma && bz > 0 && fi > Koof_H)
       {
      result= OrderSend(Symbol(), OP_BUY, 1, Ask, Slippage, Stoploss , TakeProfit, "", magic, 0, Lime);
      
        }
       if (Bid == ma && bz < 0 && fi < Koof_L)
       {
      result= OrderSend(Symbol(), OP_SELL, 1, Bid, Slippage, Stoploss , TakeProfit, "", magic, 0, Red);
       }
 
Vitaly Muzichenko:

Да не найдёт он ошибку, вы уж сразу подскажите:

ок.

после каждой команды на открытие/закрытие любого ордера дописать эту строчку:

if(result<0 && Fun_Error(GetLastError())==1){return(0);}

а вызываемую функцию разместить после кода советника:

//+------------------------------------------------------------------+
//| ФУНКЦИЯ ОБРАБОТКИ ОШИБОК                                         |
//+------------------------------------------------------------------+
 int Fun_Error(int Error)                        
  {   switch(Error)
     {                                          // Преодолимые ошибки        
           case 0:      return (0);
           case 1:      Print("Попытка изменить уже установленные значения такими же значениями.");return(1);
           case 2:      Print("Общая ошибка. Прекратить все попытки торговых операций до выяснения обстоятельств.");return(0);
           case 3:      Print("В торговую функцию переданы неправильные параметры.");return(1);
           case 4:      Print("Торговый сервер занят.Пробуем ещё раз..");Sleep(3000);return(1);
           case 5:      Print("Старая версия клиентского терминала.");return(0);
           case 6:      Print("Нет связи с торговым сервером.");return(1);
           case 7:      Print("Недостаточно прав.");return(1);
           case 8:      Print("Слишком частые запросы.");return(1);
           case 9:      Print("Недопустимая операция нарушающая функционирование сервера.");return(1);
           case 64:     Print("Счет заблокирован. Необходимо прекратить все попытки торговых операций.");return(0);
           case 65:     Print("Неправильный номер счета.");return(1);
           case 128:    Print("Истек срок ожидания совершения сделки.");return(1);
           case 129:    Print("Неправильная цена bid или ask, возможно, ненормализованная цена.");return(1);
           case 130:    Print("Слишком близкие стопы или неправильно рассчитанные или ненормализованные цены в стопах (или в цене открытия отложенного ордера).");return(1);
           case 131:    Print("Неправильный объем, ошибка в грануляции объема.");return(1);
           case 132:    Print("Рынок закрыт.");return(1);
           case 133:    Print("Торговля запрещена.");return(0);
           case 134:    Print("Недостаточно денег для совершения операции.");return(0);
           case 135:    Print("Цена изменилась. Пробуем ещё раз..");RefreshRates();return(1);
           case 136:    Print("Нет цен. Ждём новый тик..");
                        while(RefreshRates()==false)           // До нового тика            
                        Sleep(1);
                        return(1);
           case 137:    Print("Брокер занят.Пробуем ещё раз..");Sleep(3000);return(1);
           case 138:    Print("Запрошенная цена устарела, либо перепутаны bid и ask.");return(1);
           case 139:    Print("Ордер заблокирован и уже обрабатывается.");return(1);
           case 140:    Print("Разрешена только покупка. Повторять операцию SELL нельзя.");return(1);
           case 141:    Print("Слишком много запросов.");return(1);
           case 142:    Print("Ордер поставлен в очередь.");return(1);
           case 143:    Print("Ордер принят дилером к исполнению.");return(1);
           case 144:    Print("Ордер аннулирован самим клиентом при ручном подтверждении сделки.");return(1);
           case 145:    Print("Модификация запрещена, так как ордер слишком близок к рынку и заблокирован из-за возможного скорого исполнения.");return(1);
           case 146:    Print("Подсистема торговли занята.Пробуем ещё..");Sleep(500);return(1);
           case 147:    Print("Использование даты истечения ордера запрещено брокером.");return(1);
           case 148:    Print("Количество открытых и отложенных ордеров достигло предела, установленного брокером.");return(1);
           case 149:    Print("Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено.");return(1);
           case 4000:   return (0);
           case 4001:   Print("Неправильный указатель функции.");return(1);
           case 4002:   Print("Индекс массива - вне диапазона.");return(1);
           case 4003:   Print("Нет памяти для стека функций.");return(1);
           case 4004:   Print("Переполнение стека после рекурсивного вызова.");return(1);
           case 4005:   Print("На стеке нет памяти для передачи параметров.");return(1);
           case 4006:   Print("Нет памяти для строкового параметра.");return(1);
           case 4007:   Print("Нет памяти для временной строки.");return(1);
           case 4008:   Print("Неинициализированная строка.");return(1);
           case 4009:   Print("Неинициализированная строка в массиве.");return(1);
           case 4010:   Print("Нет памяти для строкового массива.");return(1);
           case 4011:   Print("Слишком длинная строка.");return(1);
           case 4012:   Print("Остаток от деления на ноль.");return(1);
           case 4013:   Print("Деление на ноль.");return(1);
           case 4014:   Print("Неизвестная команда.");return(1);
           case 4015:   Print("Неправильный переход.");return(1);
           case 4016:   Print("Неинициализированный массив.");return(1);
           case 4017:   Print("Вызовы DLL не разрешены.");return(1);
           case 4018:   Print("Невозможно загрузить библиотеку.");return(1);
           case 4019:   Print("Невозможно вызвать функцию.");return(1);
           case 4020:   Print("Вызовы внешних библиотечных функций не разрешены.");return(1);
           case 4021:   Print("Недостаточно памяти для строки, возвращаемой из функции.");return(1);
           case 4022:   Print("Система занята.");return(1);
           case 4050:   Print("Неправильное количество параметров функции.");return(1);
           case 4051:   Print("Недопустимое значение параметра функции.");return(1);
           case 4052:   Print("Внутренняя ошибка строковой функции.");return(1);
           case 4053:   Print("Ошибка массива.");return(1);
           case 4054:   Print("Неправильное использование массива-таймсерии.");return(1);
           case 4055:   Print("Ошибка пользовательского индикатора.");return(1);
           case 4056:   Print("Массивы несовместимы.");return(1);
           case 4057:   Print("Ошибка обработки глобальныех переменных.");return(1);
           case 4058:   Print("Глобальная переменная не обнаружена.");return(1);
           case 4059:   Print("Функция не разрешена в тестовом режиме.");return(1);
           case 4060:   Print("Функция не подтверждена.");return(1);
           case 4061:   Print("Ошибка отправки почты.");return(1);
           case 4062:   Print("Ожидается параметр типа string.");return(1);
           case 4063:   Print("Ожидается параметр типа integer.");return(1);
           case 4064:   Print("Ожидается параметр типа double.");return(1);
           case 4065:   Print("В качестве параметра ожидается массив.");return(1);
           case 4066:   Print("Запрошенные исторические данные в состоянии обновления.");return(1);
           case 4067:   Print("Ошибка при выполнении торговой операции.");return(1);
           case 4099:   Print("Конец файла.");return(1);
           case 4100:   Print("Ошибка при работе с файлом.");return(1);
           case 4101:   Print("Неправильное имя файла.");return(1);
           case 4102:   Print("Слишком много открытых файлов.");return(1);
           case 4103:   Print("Невозможно открыть файл.");return(1);
           case 4104:   Print("Несовместимый режим доступа к файлу.");return(1);
           case 4105:   Print("Ни один ордер не выбран.");return(1);
           case 4106:   Print("Неизвестный символ.");return(1);
           case 4107:   Print("Неправильный параметр цены для торговой функции.");return(1);
           case 4108:   Print("Неверный номер тикета.");return(1);
           case 4109:   Print("Торговля не разрешена. Необходимо включить опцию Разрешить советнику торговать в свойствах эксперта.");return(1);
           case 4110:   Print("Длинные позиции не разрешены. Необходимо проверить свойства эксперта.");return(1);
           case 4111:   Print("Короткие позиции не разрешены. Необходимо проверить свойства эксперта.");return(1);
           case 4200:   Print("Объект уже существует.");return(1);
           case 4201:   Print("Запрошено неизвестное свойство объекта.");return(1);
           case 4202:   Print("Объект не существует.");return(1);
           case 4203:   Print("Неизвестный тип объекта.");return(1);
           case 4204:   Print("Нет имени объекта.");return(1);
           case 4205:   Print("Ошибка координат объекта.");return(1);
           case 4206:   Print("Не найдено указанное подокно.");return(1);
           case 4207:   Print("Ошибка при работе с объектом.");return(1);
           return(0);
     }
     return(0);  
  }
 

Пишу советник по индикатору Ma_C.


Подскажите, ПОЖАЛУЙСТА, как мне прописать условия покупки/продажи, если мне необходимо взять данные из буфера индикатора 1 и 2  пустые - в бай, не пустые буферы 1 и 2 - в селл.


Буду очень признателен за помощь.

Файлы:
MA_C.mq4  10 kb
 
Я недавно спрашивал совета на счет того, что не всегда модифицируется ордер на ndd счете (спасибо всем кто откликнулся).  Дело оказалось все же не в моем советнике. Я несколько раз пытался узнать у тех-поддержки [название удалено Artyom Trishkin] о возможных ограничениях при модификации - времени от открытия ордера до момента модификации, наличии минимального расстояние от цены открытия до уровня выставления стопа и профита. На первый вопрос мне отвечали - ограничений нет, на второй - только на величину спреда. Как оказалось либо ни они (тех-поддержка), ни их тех-отдел не знают, что у них в действительности происходит, либо обманывают. Во время начала торговой сессии они (ограничения) есть (расстояние от цены открытия до уровней стопа и профита) и очень существенные - например по фунт/франк в 6 раз больше спреда (180 пунктов, на пятизнаке, при с спреде 32, хотя средний по этой паре, согласно их документации 0.23), на австр/кан больше чем 10 раз - 160 п. при среде 11 и т.д. Так что не удивительно, что у меня не модифицируются ордера при ТП по этим парам 100 (пятизнак) пунктов. Хотя у [название удалено Artyom Trishkin] данный тип счетов позиционируется как скальперский. Так то. Пишу, может кому пригодится. Всем удачи.