Баг в функции OrderSend() ? - страница 9

 
borilunad:
Поэтому не нужно устанавливать точное отношение машек с барами. Можно только рассматривать машки с машками и лучше их использовать как фильтры, а не как сигналы.

 Борис, Ты отчасти прав. В основном, машки это указатель. Хотя тут опять же есть несколько вариантов. КТо-то ищёт где войти в контртренд, а кто-то и по тренду.. Вариаций много, НО они пока что ещё не заработали как нужно :(
 
hoz:

 Борис, Ты отчасти прав. В основном, машки это указатель. Хотя тут опять же есть несколько вариантов. КТо-то ищёт где войти в контртренд, а кто-то и по тренду.. Вариаций много, НО они пока что ещё не заработали как нужно :(
Не грусти за других! Ищи своё и найдёшь! Правы те, кто говорит, что на индикаторы надеяться нечего, потому что не поспевают за ценой. Нужно входить по рынку, его тенденции, по крайней мере, меньше риска. А главное, сопровождение позиции до возможного профита и оптимальное закрытие. :)
 

 Да суть то не в грусти, и не в других. Суть в том, что баг есть, и поддержка не отвечает вообще! Неужели им плевать на клиентов. Мне это очень даже интересно. Заявка висит уже неделю почти, и реакции вообще ноль... Может виде снять и показать как цена идёт и на текущем баре, тар просекает машку на сквозь, а отложки нет? Да я прицепился к этому моменту, НО только с тем лишь замыслом, чтоб понять причину. С понедельника поставлю на тест на демо, но... опять же.. если тестер глючный совсем, то нафиг он тогда такой нужен? 

 
hoz:

 ... Может виде снять и показать как цена идёт и на текущем баре, тар просекает машку на сквозь ...

Не было у меня этого с Машкой.
 
tara:
Не было у меня этого с Машкой.


С какой Машкой?

 Я же канкретно писал в каких случаях. Зачем тогда переводить на себя? Ветка уже на 9 страниц, а "воз и ныне там".

 Прикрепляю код. Вот тот же код для просмотра:

//+-----------------------------------------------------------------------------------+
//|                                                                       test_Ma.mq4 |
//|                                                                               hoz |
//|                                                                                   |
//+-----------------------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

extern string ___H0 = " ___________ Параметры МА ____________ ";
extern int i_TF = 0,
           i_fastMaPeriod = 10,
           i_slowMaPeriod = 21;
extern string ___H1 = " _____ Параметры ордера _______";
extern int i_magic = 3333021;
extern double i_thresholdFromMa = 5;                           // Отступ от МА
extern double buyHear = 10,                                    // Расстояние от МА до отложки на бай
              SellHear = 10;                                   // Расстояние от МА до отложки на шорт
// Машечки
double fastMa,
       slowMa;
double pt;
datetime lastBarTime;                                          // Время проведения последних рассчётов
// Переменные рыночного окружения
double g_spread,
       g_stopLevel,
       g_tickSize;
// Идентификаторы положений машек
#define MA_DIRECT_TO_UP      0                                 // Машки направлены вверх
#define MA_DIRECT_TO_DOWN    1                                 // Машки направлены вниз
#define MA_DIRECT_TO_NONE   -1                                 // Машки во флете
#define SIGNAL_BUY           0                                 // Сигнал на покупку
#define SIGNAL_SELL          1                                 // Сигнал на продажу
#define SIGNAL_NO           -1                                 // Сигнала нет

//+-------------------------------------------------------------------------------------+
//| Функция иницилизации                                                                |
//+-------------------------------------------------------------------------------------+
int init()
{
   GetMarketInfo();
   
   lastBarTime = 0;
   
   if (Digits  == 2 || Digits == 4)
       pt = Point;
   if (Digits == 1 || Digits == 3 || Digits == 5)
       pt = Point * 10;
   if (Digits == 6)
       pt = Point * 100;
   if (Digits == 7)
       pt = Point * 1000;
   

  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации                                                              |
//+-------------------------------------------------------------------------------------+
int deinit()
{
//----
   
//----
  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Сбор рыночных данных                                                                |
//+-------------------------------------------------------------------------------------+
void GetMarketInfo()
{
  g_spread = MarketInfo(Symbol(),MODE_SPREAD) * pt;
  g_stopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL) * pt;
  g_tickSize = MarketInfo(Symbol(),MODE_TICKSIZE) * pt;
}
//+-------------------------------------------------------------------------------------+
//| Функция нормализации                                                                |
//+-------------------------------------------------------------------------------------+
double ND(double A)
{
  return (NormalizeDouble(A, Digits));
}
//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
   int ticket = -1;
   double OOP = fastMa + buyHear * pt;             // Получаем значение цны открытия
   
   if ((ND(OOP) - Ask) >= MathMax(g_stopLevel,g_spread))             // Проверка цену открытия на стоплевел          
   {
       if (ND(OOP) > Ask)           // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником
       {
           Print("Bid = ", Bid);
           Print("Ask = ", Ask);
           Print("fastMa = ", fastMa);
           Print("Цена покупки = ", fastMa + buyHear * pt);
           Print("i_thresholdFromMa * pt = ", i_thresholdFromMa * pt);
           ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(OOP), 3, 0, 0, NULL, i_magic, 0);
       }
   }
   if (ticket > 0)
   {
       return (true);
   }
   else
    
   Alert (GetLastError());
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
   int ticket = -1;
   double OOP = fastMa - SellHear * pt;               // Получаем значение цны открытия
   
   if ((Bid - ND(OOP)) >= MathMax(g_stopLevel,g_spread))                // Проверка цену открытия на стоплевел
   {
       if (ND(OOP) < Bid)           // Проверка что цена открытия ниже Bid, т.к. у нас вход отложенником
       {
           Print("Bid = ", Bid);
           Print("Ask = ", Ask);
           Print("fastMa = ", fastMa);
           Print("fastMa + i_thresholdFromMa * pt = ", fastMa + i_thresholdFromMa * pt);
           Print("Цена покупки = ", fastMa + buyHear * pt);
           Print("i_thresholdFromMa * pt = ", i_thresholdFromMa * pt);
           ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, ND(OOP), 3, 0, 0, NULL, i_magic, 0);
       }
   }
   if (ticket > 0)
   {
       return (true);
   }
   else
    
   Alert (GetLastError());
}
//+-------------------------------------------------------------------------------------+
//| Получаем относительное положение машек                                              |
//+-------------------------------------------------------------------------------------+
int GetStateMa(double fastMa, double slowMa)
{
   if (fastMa > slowMa)                          // Если условия выполнены, то..
       return (MA_DIRECT_TO_UP);                 // ..машки направлены вниз
   
   if (fastMa < slowMa)                          // Если условия выполнены, то..
       return (MA_DIRECT_TO_DOWN);               // машки направлены вверх
   
   return (MA_DIRECT_TO_NONE);                   // Машки не имеют выраженного направления
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal)
{
   if (signal == SIGNAL_BUY)                     // Если сигнал на покупку..
       if (!OpenBuy())             // ..покупаем
          return(false);
   
   if (signal == SIGNAL_SELL)                   // Если сигнал на продажу..
       if (!OpenSell())           // ..продаём
          return(false);
       
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
 //  if (FindOrders() > 0)                                 // Если есть открытые ордера, то..
   //    return (SIGNAL_NO);                               //..ничего не делаем
   
   if (GetStateMa(fastMa, slowMa) == MA_DIRECT_TO_UP)
       if ( ND(MathAbs(fastMa - Ask)) <= i_thresholdFromMa * pt) // ..зазор между ценой покупки и машки, <= i_thresholdFromMa..
          return(SIGNAL_BUY);
   if (GetStateMa(fastMa, slowMa) == MA_DIRECT_TO_DOWN)
       if ( ND(MathAbs(fastMa - Bid)) <= i_thresholdFromMa * pt ) // ..зазор между ценой продажи и машки, <= i_thresholdFromMa..
       return(SIGNAL_SELL);
   
   return (SIGNAL_NO);
}
//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_OPEN,0);
   slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_OPEN,0);
   
 /*  Print("Bid = ", Bid);
   Print("Ask = ", Ask);
   Print("fastMa = ", fastMa);
   Print("i_thresholdFromMa * pt = ", i_thresholdFromMa * pt);
   */
// Отслеживание открытия нового бара
   if (lastBarTime == iTime(NULL, 0, 0))         // На текущем баре все необходимые действия..
       return (0);                      // ..уже были выполнены

// Рассчёт сигнала   
   int signal = GetSignal();
   
// Проведение торговых операций
   if (signal != SIGNAL_NO)
       if (!Trade(signal))
           return (0);
   
   lastBarTime = iTime(NULL, 0, 0);              // На текущем баре все необходимые действия..
                                       // .. успешно выполнены
  return (0);
}

 НЕКОТОРЫЕ БАРЫ НАГЛО ИГНОРИРУЮТСЯ БЕЗПРИЧИННО. И естесственно отложки на них не ставятся. Код верный. Исправить уже нечего как я вижу.

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

1 

2

3 

 

Файлы:
test_ma_4.mq4  10 kb
 
pako:
 если не трудно сформулируйте ТЗ еще раз , зачем вам контроль нового бара?



 Сформулирую  и легко! Ещё 1 момент я не додумал, НО суть изложу целиком.

 Нужно, что б ограничений по количеству ордеров не было вообще. Т.е. ордера могут открываться в любом количестве... не важно сколько их будет, НО в текущем баре нужно, чтоб открывался только 1 ордер. Вот так вот.

 Т.е. открылся новый бар, значит можно в течении этого бара открыть 1 ордер, НО не более 1 ордера в текущем баре. Следующий ордер можно открыть только на следующем баре, не раньше..

 Так понятно теперь? 

 

А здесь Вы не правы...

//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_OPEN,0); <---------------- fastMa == slowMa 
   slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_OPEN,0);  <--------------  fastMa == slowMa

   
 

  Периоды машек разные... i_fastMaPeriod и i_slowMaPeriod соответственно равны 10 и 21!

 

Рекомендуется к прочтению

https://www.mql5.com/ru/articles/1411 

 
hoz:


 Сформулирую  и легко! Ещё 1 момент я не додумал, НО суть изложу целиком.

 Нужно, что б ограничений по количеству ордеров не было вообще. Т.е. ордера могут открываться в любом количестве... не важно сколько их будет, НО в текущем баре нужно, чтоб открывался только 1 ордер. Вот так вот.

 Т.е. открылся новый бар, значит можно в течении этого бара открыть 1 ордер, НО не более 1 ордера в текущем баре. Следующий ордер можно открыть только на следующем баре, не раньше..

 Так понятно теперь?


держи на каждом баре открывается только одна позиция

//+------------------------------------------------------------------+
//|                                                     черновик.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   if(NewBar()==true)
       {
        int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-250*Point,Ask+250*Point," ",16384,0,Green); 
       }
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
bool NewBar() 
    {

       static datetime LastTime = 0;

       if (iTime(NULL,0,0) != LastTime) 
       {
          LastTime = iTime(NULL,0,0);      
          return (true);
       } else
          return (false);
    }
 
pako:


держи на каждом баре открывается только одна позиция

 

Так нельзя. Если у тебя на первом тике условие не совпало, весь час пролетит впустую.
 
hoz:


 Сформулирую  и легко! Ещё 1 момент я не додумал, НО суть изложу целиком.

 Нужно, что б ограничений по количеству ордеров не было вообще. Т.е. ордера могут открываться в любом количестве... не важно сколько их будет, НО в текущем баре нужно, чтоб открывался только 1 ордер. Вот так вот.

 Т.е. открылся новый бар, значит можно в течении этого бара открыть 1 ордер, НО не более 1 ордера в текущем баре. Следующий ордер можно открыть только на следующем баре, не раньше..


Таки тогда
lastBarTime = iTime(NULL, 0, 0);              // На текущем баре все необходимые действия..
только при условии, открытия ордера на текущем баре. т.е. эту строчку в функции OpenBuy/Sell перенести
Причина обращения: