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

 
.roman.:

Ненужные расчёты (не относящиеся к проблеме) убрал. Специально для отображения косяка были дописаны в код принты. Несмотря на сравнение символа ордера с символом, на котором открыт советник, может выдать вот это (с ози чарта брать данные ордера по евро, например, как в данном случае):

 

                        if(Ask>openPrice)
                           {
                              Print("OrderSymbol ",OrderSymbol()," OrderTicket ",OrderTicket()," OrderOpenPrice ",OrderOpenPrice());
                           }
                     

Такое не могло выдать, Аск на кенгуру никак не мог быть больше любой цены открытия на евродолларе в 2015...

 А все проверки выбранного ордера лучше производить после выбора, отдельным условием if(). 

 
evillive:

 

Такое не могло выдать, Аск на кенгуру никак не мог быть больше любой цены открытия на евродолларе в 2015...

 А все проверки выбранного ордера лучше производить после выбора, отдельным условием if(). 

Всё верно, не могло. Поэтому выдало по Bid<openPrice ордера по евре по 1.11262.

То есть, предлагаете сделать проверить на наличие ордера чере if(OrderSelect()), а потом во вложенном if уже сравнивать символ чарта с символом ордера, цену открытия и т.п.?

 
.roman.:

Всё верно, не могло. Поэтому выдало по Bid<openPrice ордера по евре по 1.11262.

То есть, предлагаете сделать проверить на наличие ордера чере if(OrderSelect()), а потом во вложенном if уже сравнивать символ чарта с символом ордера, цену открытия и т.п.?

Да, именно, сначала OrderSelect(), а следующей проверкой - уже остальные параметры.
 

Не помогут пляски с бубном.

Никакой разницы нет в одной строке писать выбор ордера и проверку символа и магика или разделить их на 3 разные строки. Согласно изменениям в новых билдах проверка условий происходит поэтапно, тоесть если первое условие не выполнено, следующие и проверяться не будут. То-же самое что и 3 строки. Выполнено первое условие, проверяем второе. И только если и второе условие выполнено переходит на проверку третьего условия.

Проблема видимо в том, что в удалённой части кода есть вызов пользовательской функции в которой есть выбор другого ордера.

 

Если бы там было еще хоть одно упоминание о работе с ордерами, это было бы первым, на что я обратил внимание. Но там только расчёты, ни единой пользовательской функции не используется. Непонятно, что именно вызывает выбор ордера с другой пары. Поэтому я так и озадачился указанной в документации "программной средой" и уже переделал код, как предложил evillive и готов с бубнами поплясать. Следующим извратом будет принудительное сравнение с бидом\аском нужной пары через маркетинфо.


UPD.: Проблема решилась. На самом деле была найдена вложенная функция, в которой используется свой OrderSelect. Спасибо за поданную идею, AlexeyVik.

 
Всем привет! Подскажите как решить задачу, в цикле нахожу нужный номер бара, но мне также нужен и прошлый номер бара по циклу, как реализовать это лаконично? Спасибо.
for(i=limit; i>=0; i--)
{
yesterday_weekday = TimeDayOfWeek(iTime(Symbol(),0,i-1))-TimeDayOfWeek(iTime(Symbol(),0,i));
if (yesterday_weekday ==1)
yesterday_time=iTime(Symbol(),0,i);
yesterday_shift=iBarShift(Symbol(),0,yesterday_time0);//последний бар 

}
 
 

Вот создал советник (не для работы, просто для практики)

Но почему то он не срабатывает на истории если в функции ЕСЛИ заданы оба параметра, если их задать по очереди все срабатывает на отлично вот код (и еще: подскажите как сделать, чтобы если уже есть открытый ордер Buy следующий ордер Buy не открывался, даже если все условия соответствуют?): 

//+------------------------------------------------------------------+
//|                                                        новый.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()

  {
  
double PC = iClose ("EURUSD", PERIOD_H1, 0);  

double MA = NormalizeDouble (iMA ("EURUSD", PERIOD_H1, 12, 0, MODE_LWMA, PRICE_MEDIAN, 0), 4); 


if (Ask == MA && PC-->MA )
OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-30*Point, Ask+30*Point);

   
return (0);





   
  }
//+------------------------------------------------------------------+
 
inuboh:

Вот создал советник (не для работы, просто для практики)

Но почему то он не срабатывает на истории если в функции ЕСЛИ заданы оба параметра, если их задать по очереди все срабатывает на отлично вот код (и еще: подскажите как сделать, чтобы если уже есть открытый ордер Buy следующий ордер Buy не открывался, даже если все условия соответствуют?): 

Не то, чтобы прямо это и есть источник всех бед, но чисто из академического интересу: почему одновременно OnInit(), OnDeinit() и потом вдруг start()???

А по вопросу, сильно не рекомендовано такое сравнение Ask == MA, крайне редко сбывается на истории. Ну и вот что такое выражение  PC-->MA означает?

А по поводу разрешения на один Бай, в цикле перебираем все рыночные позиции, сравниваем с заданными критериями - символ, тип, магик, при нахождении искомого - увеличиваем счётчик на единицу. Потом там, где надо, этот счётчик смотрим.

Вот как-то так:

   _ExpertOrdersB=0;
   _ExpertOrdersS=0;

   for(int z=OrdersTotal()-1; z>=0; z --)
     {
      if(!OrderSelect(z,SELECT_BY_POS))
        {
         Print(". OrderSelect("+IntegerToString(z)+", SELECT_BY_POS ) FAIL!. Error #"+IntegerToString(GetLastError()));
        }
      if((OrderMagicNumber()==magic) && OrderSymbol()==_Symbol)
        {
          switch(OrderType())
           {
            default: break;
            case 0:
               _ExpertOrdersB++;
               break;
            case 1:
               _ExpertOrdersS++;
               break;
           }
        }
     }


if (_ExpertOrdersB < 1) //если нет покупок, то пытаемся купить, при условии, что:
if (Ask == MA && PC-->MA )
OrderSend("EURUSD",OP_BUY,1,Ask,3,Ask-30*Point, Ask+30*Point); 
 
evillive:

Не то, чтобы прямо это и есть источник всех бед, но чисто из академического интересу: почему одновременно OnInit(), OnDeinit() и потом вдруг start()???

А по вопросу, сильно не рекомендовано такое сравнение Ask == MA, крайне редко сбывается на истории. Ну и вот что такое выражение  PC-->MA означает?

А по поводу разрешения на один Бай, в цикле перебираем все рыночные позиции, сравниваем с заданными критериями - символ, тип, магик, при нахождении искомого - увеличиваем счётчик на единицу. Потом там, где надо, этот счётчик смотрим.

start() как  то по "привычке" переправил )

Почему Ask == MA редкое событие? разве текущая цена спроса редко касается линии Moving Average?

А PC-->MA у меня это - если предыдущая цена закрытия выше линии Moving Average (по другому я не придумал как сделать).

Так вот, когда я в функцию ЕСЛИ по очереди включаю сначала только Ask == MA а потом только PC-->MA все нормально работает, а вот когда их совмещаю, не работает!

 
evillive:

Не то, чтобы прямо это и есть источник всех бед, но чисто из академического интересу: почему одновременно OnInit(), OnDeinit() и потом вдруг start()???

А по вопросу, сильно не рекомендовано такое сравнение Ask == MA, крайне редко сбывается на истории. Ну и вот что такое выражение  PC-->MA означает?

А по поводу разрешения на один Бай, в цикле перебираем все рыночные позиции, сравниваем с заданными критериями - символ, тип, магик, при нахождении искомого - увеличиваем счётчик на единицу. Потом там, где надо, этот счётчик смотрим.

Вот как-то так:

Я понял так, что РС-- > MA это тоже самое что РС-1 > MA

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