Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
спасибо.
Билд 200, демо Альпари, инструмент USDJPY.
Суть проблемы: как-то кривовато советник работал.
Стал ииследовать проблему. На третий день, текст программы советника свёлся к бесконечному циклу, в котором с задержками в 5 секунд открывается и закрывается позиция. Этот "советник" может час работать нормально, а потом минут 10-15 лезут ошибки 129 и 138. Потом снова всё впорядке.
Ошибка 129 - invalid price
Ошибка 138 - requote
В общем, в конце концов вывел в коммент значения цен:
Comment(DoubleToStr(Ask,Digits)," ",DoubleToStr(MarketInfo(Symbol(),MODE_ASK),Digits));
И оказалось, что значения Ask и MarketInfo(Symbol(),MODE_ASK) отличаются от 1 до 4 пунктов. При этом линии Ask на графике соответсвует только MarketInfo(Symbol(),MODE_ASK). А, поскольку, в операторе OrderSend() используется именно Ask, вот советник и глючит. С Bid'ом та же ерунда. И поэтому при закрытии позиции тоже лезет ошибка 129.
Но, ещё раз обращаю внимание, Ask и MarketInfo() в равных условиях выдают разные значения.
#include <WinUser32.mqh> #include <stdlib.mqh> double Lots; int try,ticket,err,err_descr; double ASK,BID; //+------------------------------------------------------------------+ int init() { start(); return; } //+------------------------------------------------------------------+ int start() { while(true) { Trade(); Sleep(1000); } return; } //+------------------------------------------------------------------+ void Trade() { ticket=0; try=0; Lots=0.1; while(ticket<1) { Comment("\nAsk ",DoubleToStr(Ask,Digits)," ASK ",DoubleToStr(MarketInfo(Symbol(),MODE_ASK),Digits)); if(!IsTradeContextBusy()) { // ASK=NormalizeDouble(MarketInfo(Symbol(),MODE_ASK),Digits); ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,0,0); try++; err=GetLastError(); err_descr=err; if(err>1) Comment("Ошибка открытия! Попыток ",try," ",err," = ",ErrorDescription(err_descr),"\nAsk ",DoubleToStr(Ask,Digits)," ASK ",DoubleToStr(MarketInfo(Symbol(),MODE_ASK),Digits)); if(err==129 || err==138) { MessageBox(err+"\nAsk = "+DoubleToStr(Ask,Digits)+"\nASK = "+DoubleToStr(MarketInfo(Symbol(),MODE_ASK),Digits)+"\n","Открытие",MB_OK|MB_TOPMOST|MB_ICONHAND); } } Sleep(1000); if(ticket>0) break; } bool close, found; for(int cnt=0; cnt<OrdersTotal(); cnt++) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); if(OrderTicket()==ticket) { found=true; break; } } if(!found) return; try=0; while(!close) //закрытие позиции { Comment("\nBid ",DoubleToStr(Bid,Digits)," BID ",DoubleToStr(MarketInfo(Symbol(),MODE_BID),Digits)); if(!IsTradeContextBusy()) { // BID=NormalizeDouble(MarketInfo(Symbol(),MODE_BID),Digits); close=OrderClose(ticket,Lots,Bid,1); try++; err=GetLastError(); err_descr=err; if(err>1) Comment("Ошибка закрытия. Позиция ",ticket," Попыток ",try," ",err," = ",ErrorDescription(err_descr),"\nBid ",DoubleToStr(Bid,Digits)," BID ",DoubleToStr(MarketInfo(Symbol(),MODE_BID),Digits)); if(err==129 || err==138) { MessageBox(err+"\nBid = "+DoubleToStr(Bid,Digits)+"\nBID = "+DoubleToStr(MarketInfo(Symbol(),MODE_BID),Digits)+"\n","Закрытие",MB_OK|MB_TOPMOST|MB_ICONHAND); } } Sleep(1000); } return(0); } //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+За эксперта, который бездумно открывает и закрывает сделки каждые 5 секунд в зацикленном состоянии любой брокер будет применять максимально жесткие действия. И никакие обоснования "я же тестировал эксперта! это мое право, да как вы смеете?" не пройдут.
Сколько раз повторять - думайте над тем, что творите. Вы же внаглую плюете на брокера.
Соответственно, отношение к вам будет аналогичным.
//+------------------------------------------------------------------+ //| avm_looped_cycle.mq4 | //| Copyright © 2007, MetaQuotes Software Corp. | //| http://www.metaquotes.ru | //+------------------------------------------------------------------+ #property copyright "avm" #property link "http://www.metaquotes.ru/forum/8085/" #include <WinUser32.mqh> #include <stdlib.mqh> double Lots; int try,ticket,err,err_descr; double ASK,BID; //+------------------------------------------------------------------+ int init() { start(); return; } //+------------------------------------------------------------------+ int start() { while(true) { Trade(); Sleep(1000); } return; } //+------------------------------------------------------------------+ void Trade() { ticket=0; try=0; Lots=0.1; while(ticket<1) { Comment("\nAsk ",DoubleToStr(Ask,Digits)," ASK ",DoubleToStr(MarketInfo(Symbol(),MODE_ASK),Digits)); if(!IsTradeContextBusy()) { // ASK=NormalizeDouble(MarketInfo(Symbol(),MODE_ASK),Digits); RefreshRates(); ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,0,0); try++; err=GetLastError(); err_descr=err; if(err>1) Comment("Ошибка открытия! Попыток ",try," ",err," = ",ErrorDescription(err_descr),"\nAsk ",DoubleToStr(Ask,Digits)," ASK ",DoubleToStr(MarketInfo(Symbol(),MODE_ASK),Digits)); if(err==129 || err==138) { MessageBox(err+"\nAsk = "+DoubleToStr(Ask,Digits)+"\nASK = "+DoubleToStr(MarketInfo(Symbol(),MODE_ASK),Digits)+"\n","Открытие",MB_OK|MB_TOPMOST|MB_ICONHAND); } } Sleep(1000); if(ticket>0) break; } bool close, found; for(int cnt=0; cnt<OrdersTotal(); cnt++) { OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES); if(OrderTicket()==ticket) { found=true; break; } } if(!found) return; try=0; while(!close) //закрытие позиции { Comment("\nBid ",DoubleToStr(Bid,Digits)," BID ",DoubleToStr(MarketInfo(Symbol(),MODE_BID),Digits)); if(!IsTradeContextBusy()) { // BID=NormalizeDouble(MarketInfo(Symbol(),MODE_BID),Digits); RefreshRates(); close=OrderClose(ticket,Lots,Bid,1); try++; err=GetLastError(); err_descr=err; if(err>1) Comment("Ошибка закрытия. Позиция ",ticket," Попыток ",try," ",err," = ",ErrorDescription(err_descr),"\nBid ",DoubleToStr(Bid,Digits)," BID ",DoubleToStr(MarketInfo(Symbol(),MODE_BID),Digits)); if(err==129 || err==138) { MessageBox(err+"\nBid = "+DoubleToStr(Bid,Digits)+"\nBID = "+DoubleToStr(MarketInfo(Symbol(),MODE_BID),Digits)+"\n","Закрытие",MB_OK|MB_TOPMOST|MB_ICONHAND); } } Sleep(1000); } return(0); } //+------------------------------------------------------------------+ int deinit() { return(0); } //+------------------------------------------------------------------+Вставил в двух местах RefreshRates()
За эксперта, который бездумно открывает и закрывает сделки каждые 5 секунд в зацикленном состоянии любой брокер будет применять максимально жесткие действия. И никакие обоснования "я же тестировал эксперта! это мое право, да как вы смеете?" не пройдут.
Сколько раз повторять - думайте над тем, что творите. Вы же внаглую плюете на брокера.
Соответственно, отношение к вам будет аналогичным.
Ренат, а Вы вообще-то посты выше текста программы смотрели? В моем советнике (который, кстати, и стоит-то на демо) никаких циклов нет. Он как-то на днях позицию не открыл и выдал сообщение об ошибке 129. А приведённый выше пример нужен всего лишь для того (и сделан исключительно только для этого), чтобы Вы же и увидели побыстрее своими глазами эту же ситуацию, описанную ещё выше. А за брокеров Вы можете быть спокойны. Я все правила знаю. И чаще нескольких раз в месяц я их не беспокою.
Вставил в двух местах RefreshRates()
Да в том-то и шило. RefreshRates() вставлял, не помогло. Но скорее всего, решил бы проблему с помощью этого же RefreshRates(), если бы MarketInfo() тоже врал. Ведь не врёт. Цена во время цикла дёргается. Значение Аск стоит, как припаянное, а значение из MarketInfo() меняется. Вот, собственно, поэтому и родился вопрос. Кстати, проверил ещё Close[0] и получилось, что Bid = Close[0], и Ask = Close[0]+spread. И значения Close[0] (только значение; сам Close на ценовом графике меняется) тоже не меняются вместе с Аском и Бидом. А MarketInfo() меняется.
Ну да ладно. Я же писал в самом начале, что проблема не для обсуждения. Я на неё натолкнулся, я её описал. Вот и всё. Если такое явление имеет место быть, вы это поправите. Если это явление наблюдается только у меня, я с этим проживу. И, специально для Рената, столкнулся я с этой ситуацией в обычном советнике. Без каких-либо циклов. И "частота" работы этого советника не более одного раза в день. А согласитесь, обидна да(?), ситауциа на рынке "сложилась" один раз в сутки, а советник вместо позы выдал "инвалид прайс".