Un bug nella funzione OrderSend() ? - pagina 9

 
borilunad:
Pertanto, non c'è bisogno di impostare un rapporto esatto tra tamponi e barre. Puoi considerare i tamponi solo con i tamponi ed è meglio usarli come filtri piuttosto che come segnali.

Boris, hai in parte ragione. Fondamentalmente le lunette sono un puntatore. Di nuovo, però, ci sono alcune opzioni qui. Alcuni stanno cercando di entrare in una controtendenza e altri stanno cercando di seguire la tendenza. Ci sono molte varianti, ma non hanno ancora funzionato veramente :(
 
hoz:

Boris, hai in parte ragione. Fondamentalmente, i carri sono un puntatore. Anche in questo caso, però, ci sono diverse opzioni. Alcuni cercano di entrare in una controtendenza, e altri vanno in una tendenza... Ci sono molte varianti, ma non hanno ancora funzionato :(
Non essere triste per gli altri! Cercate il vostro e lo troverete! Se non sai cosa fare, non puoi farlo, perché il prezzo non può tenere il passo. Devi entrare nel mercato, nelle sue tendenze, almeno c'è meno rischio. E la cosa principale è seguire la posizione fino al possibile profitto e alla chiusura ottimale. :)
 

Il punto non è essere tristi, né lo è per gli altri. La linea di fondo è che c'è un bug e il supporto non risponde affatto! Non si preoccupano davvero dei clienti. Sono molto curioso. La richiesta è in sospeso da quasi una settimana, e non c'è nessuna reazione... Non so cosa farci... Forse si può prendere un video e mostrare il prezzo sulla barra corrente e la tara taglia proprio attraverso di essa, ma non ci sono ordini pendenti? Sì, mi sono attaccato a questo momento, ma solo per capirne il motivo. Lunedì lo metterò alla prova su Demo, ma... Ma d'altronde... se il tester è completamente difettoso, a cosa servirà?

 
hoz:

... Forse un video e mostrare come il prezzo va e sulla barra corrente, il catrame taglia il mach...

Non l'ho avuto con la Machka.
 
tara:
Non l'ho avuto con Mashka.


Quale Mashka?

Ho scritto specificamente in quali casi. Perché cerchi di farne una questione personale? Questo thread è già lungo 9 pagine, ma è ancora lì.

Allego il codice. Ecco lo stesso codice per la visualizzazione:

//+-----------------------------------------------------------------------------------+
//|                                                                       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);
}

ALCUNE BARRE SONO PALESEMENTE IGNORATE SENZA MOTIVO. E, naturalmente, non ci sono ordini pendenti su di loro. Il codice è corretto. Non c'è niente da aggiustare, per quanto posso vedere.

Qui ci sono degli screenshot che mostrano le posizioni che non sono state aperte. Le date dei test sono visibili anche lì. Per favore, aiutatemi a trovare la ragione. Ho già discusso tutto nel thread, ma non la domanda originale.

1

2

3

File:
test_ma_4.mq4  10 kb
 
pako:
Se non ti dispiace formulare di nuovo il ToR, perché hai bisogno di controllare una nuova barra?



Lo metterò in poche parole! C'è un'altra cosa a cui non ho pensato, ma vi darò l'idea completa.

Non ci dovrebbe essere alcun limite al numero di ordini. Cioè, gli ordini possono essere aperti in qualsiasi quantità... ... non importa quanti ne abbiamo, ma abbiamo bisogno di 1 solo ordine da aprire nella barra corrente. Questo è tutto.

Cioè, si apre una nuova barra, quindi possiamo aprire 1 ordine durante questa barra, ma non più di 1 ordine nella barra corrente. L'ordine successivo può essere aperto solo sulla barra successiva, non prima.

È chiaro ora?

E qui ti sbagli...

//+-------------------------------------------------------------------------------------+
//| Функция 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 periodi delle onde sono diversi...i_fastMaPeriod ei_slowMaPeriod sono rispettivamente 10 e 21!

 

Lettura consigliata

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

 
hoz:


Lo faccio ed è facile! Non ho pensato a 1 cosa in più, ma vi darò l'idea completa.

Non ci dovrebbe essere alcun limite al numero di ordini. Cioè gli ordini possono essere aperti in qualsiasi quantità... Non importa quanti sono, ma solo 1 ordine deve essere aperto nella barra corrente. Questo è tutto.

Cioè, si apre una nuova barra, quindi possiamo aprire 1 ordine durante questa barra, ma non più di 1 ordine nella barra corrente. L'ordine successivo può essere aperto solo sulla barra successiva, non prima.

È chiaro ora?


Tenete che su ogni barra si apre solo una posizione

//+------------------------------------------------------------------+
//|                                                     черновик.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:


tenere una sola posizione aperta su ogni barra

Non si può fare. Se non ottieni una condizione al primo segno di spunta, l'intera ora andrà sprecata.
 
hoz:


Lo renderò chiaro e semplice! Non ho ancora pensato a 1 cosa in più, ma vi darò l'idea completa.

Non ci dovrebbe essere alcun limite al numero di ordini. Cioè gli ordini possono essere aperti in qualsiasi quantità... Non importa quanti sono, ma solo 1 ordine deve essere aperto nella barra corrente. Questo è tutto.

Cioè, si apre una nuova barra, quindi possiamo aprire 1 ordine durante questa barra, ma non più di 1 ordine nella barra corrente. L'ordine successivo può essere aperto solo sulla barra successiva, non prima.


Quindi, in questo caso
lastBarTime = iTime(NULL, 0, 0);              // На текущем баре все необходимые действия..
Possiamo aprire l'ordine sulla barra corrente solo se questa è aperta, cioè dobbiamo spostare questa linea nella funzione OpenBuy/Sell
Motivazione: