Неверная стоимость 1п (может быть) - страница 2

 
да верно. в калькуляторе и спред стоит не 100п, а 10п.
спасибо.
 
Немного не в тему, но тоже проблема с пунктами. Новую ветку делать не стал, т.к. обсуждать нечего. Тут либо одно, либо другое... Хотелось бы увидеть комментарии.
Билд 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.
 
Если бы Вы перед вызовами торговых функций ( "MQL4: Торговые функции" ) использовали обновление рыночного окружения с помощью Refresh() , то такого не было бы. Попробуйте, и если ошибки останутся - напишите.
 
Если Вы имеете ввиду RefreshRates(), то это первое, что я попробовал. Правда просто использование этого оператора, а не конструкцию if(RefreshRates()) ...
Но, ещё раз обращаю внимание, Ask и MarketInfo() в равных условиях выдают разные значения.
 
Да, имел ввиду RefreshRates(), можно сказать опечатка (не знаю как это называется ). Можете выложить тот самый скрипт, чтобы мне самому не писать, я проверю на демо-счете?
 
Ок. Только это советник, а не скрипт. И, кстати, если использовать значения Аск и Бид, полученные "от" 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); }
//+------------------------------------------------------------------+


 
avm, вас за такого эксперта обязательно заблокируют. Да еще и при отсутствии RefreshRates.

За эксперта, который бездумно открывает и закрывает сделки каждые 5 секунд в зацикленном состоянии любой брокер будет применять максимально жесткие действия. И никакие обоснования "я же тестировал эксперта! это мое право, да как вы смеете?" не пройдут.

Сколько раз повторять - думайте над тем, что творите. Вы же внаглую плюете на брокера.
Соответственно, отношение к вам будет аналогичным.
 
avm, у Вас все же не было в коде обновлений перед торговыми операциями. Неужели такая конструкция тоже выдавала постоянно ошибки?
//+------------------------------------------------------------------+
//|                                             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()

 
avm, вас за такого эксперта обязательно заблокируют. Да еще и при отсутствии RefreshRates.

За эксперта, который бездумно открывает и закрывает сделки каждые 5 секунд в зацикленном состоянии любой брокер будет применять максимально жесткие действия. И никакие обоснования "я же тестировал эксперта! это мое право, да как вы смеете?" не пройдут.

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

Ренат, а Вы вообще-то посты выше текста программы смотрели? В моем советнике (который, кстати, и стоит-то на демо) никаких циклов нет. Он как-то на днях позицию не открыл и выдал сообщение об ошибке 129. А приведённый выше пример нужен всего лишь для того (и сделан исключительно только для этого), чтобы Вы же и увидели побыстрее своими глазами эту же ситуацию, описанную ещё выше. А за брокеров Вы можете быть спокойны. Я все правила знаю. И чаще нескольких раз в месяц я их не беспокою.
 
avm, у Вас все же не было в коде обновлений перед торговыми операциями. Неужели такая конструкция тоже выдавала постоянно ошибки?
Вставил в двух местах RefreshRates()

Да в том-то и шило. RefreshRates() вставлял, не помогло. Но скорее всего, решил бы проблему с помощью этого же RefreshRates(), если бы MarketInfo() тоже врал. Ведь не врёт. Цена во время цикла дёргается. Значение Аск стоит, как припаянное, а значение из MarketInfo() меняется. Вот, собственно, поэтому и родился вопрос. Кстати, проверил ещё Close[0] и получилось, что Bid = Close[0], и Ask = Close[0]+spread. И значения Close[0] (только значение; сам Close на ценовом графике меняется) тоже не меняются вместе с Аском и Бидом. А MarketInfo() меняется.

Ну да ладно. Я же писал в самом начале, что проблема не для обсуждения. Я на неё натолкнулся, я её описал. Вот и всё. Если такое явление имеет место быть, вы это поправите. Если это явление наблюдается только у меня, я с этим проживу. И, специально для Рената, столкнулся я с этой ситуацией в обычном советнике. Без каких-либо циклов. И "частота" работы этого советника не более одного раза в день. А согласитесь, обидна да(?), ситауциа на рынке "сложилась" один раз в сутки, а советник вместо позы выдал "инвалид прайс".
Причина обращения: