Un bug dans la fonction OrderSend() ? - page 9

 
borilunad:
Il n'est donc pas nécessaire de fixer un rapport exact entre les écouvillons et les barres. Vous ne pouvez considérer les écouvillons qu'avec des écouvillons et il est préférable de les utiliser comme des filtres plutôt que comme des signaux.

Boris, vous avez en partie raison. En fait, les lunette sont un pointeur. Mais là encore, il y a plusieurs possibilités. Certains cherchent à entrer dans une contre-tendance, d'autres à suivre la tendance. Il y a beaucoup de variations, mais elles n'ont pas encore vraiment fonctionné :(
 
hoz:

Boris, tu as en partie raison. En gros, les wagons sont une indication. Mais là encore, plusieurs options s'offrent à vous. Certains cherchent à entrer dans une contre-tendance, d'autres dans une tendance... Il y a beaucoup de variantes, mais elles n'ont pas encore fonctionné :(
Ne soyez pas triste pour les autres ! Cherchez le vôtre, et vous le trouverez ! Si vous ne savez pas quoi faire, vous ne pouvez pas le faire, car le prix ne peut pas suivre. Vous devez entrer dans le marché, ses tendances, au moins il y a moins de risque. Et l'essentiel est de suivre la position jusqu'au profit possible et à la clôture optimale. :)
 

Il ne s'agit pas d'être triste, ni de s'adresser aux autres. L'essentiel est qu'il y a un bug et que le support ne répond pas du tout ! Ils ne se soucient pas vraiment des clients. Je suis très curieux à ce sujet. La demande est en attente depuis presque une semaine, et il n'y a aucune réaction... Je ne sais pas quoi en faire... Peut-être pouvez-vous prendre une vidéo et montrer le prix sur la barre actuelle et la tare le traverse, mais il n'y a pas d'ordres en attente ? Oui, je me suis attaché à ce moment, mais seulement pour en comprendre la raison. Lundi, je le mettrai à l'épreuve sur Demo, mais... Mais encore une fois... si le testeur est totalement défaillant, à quoi servira-t-il ?

 
hoz:

... Peut-être une vidéo et montrer comment le prix va et sur la barre actuelle, le goudron coupe à travers la mach...

Je n'avais pas ça avec la Machka.
 
tara:
Je n'ai pas connu cela avec Mashka.


Quel Mashka ?

J'ai spécifiquement écrit dans quels cas. Pourquoi essaies-tu d'en faire une affaire personnelle ? Ce fil a déjà 9 pages de long, mais il est toujours là.

Je joins le code. Voici le même code pour la visualisation :

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

CERTAINS BARS SONT IGNORÉS DE MANIÈRE FLAGRANTE ET SANS RAISON. Et bien sûr, il n'y a pas d'ordres en attente sur eux. Le code est correct. Il n'y a rien à réparer pour autant que je puisse voir.

Voici des captures d'écran montrant les positions qui n'ont pas été ouvertes. Les dates des tests peuvent également être consultées ici. Veuillez m'aider à trouver la raison. J'ai déjà discuté de tout dans ce fil, mais pas de la question initiale.

1

2

3

Dossiers :
test_ma_4.mq4  10 kb
 
pako:
Si cela ne vous dérange pas de reformuler le cahier des charges, pourquoi avez-vous besoin de contrôler une nouvelle barre ?



Je vais vous le dire en quelques mots ! Il y a encore une chose à laquelle je n'ai pas pensé, mais je vais vous donner l'idée générale.

Il ne devrait pas y avoir de limite au nombre d'ordres du tout. C'est-à-dire que les commandes peuvent être ouvertes en n'importe quelle quantité... ... peu importe combien nous en avons, mais nous avons besoin qu'une seule commande soit ouverte dans la barre actuelle. C'est tout.

C'est-à-dire qu'une nouvelle barre s'ouvre, nous pouvons donc ouvrir un ordre pendant cette barre, mais pas plus d'un ordre dans la barre actuelle. L'ordre suivant ne peut être ouvert que sur la barre suivante, pas avant.

C'est clair maintenant ?

Et là, vous avez tort...

//+-------------------------------------------------------------------------------------+
//| Функция 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

   

Les périodes des ondes sont différentes...i_fastMaPeriod eti_slowMaPeriod sont respectivement 10 et 21 !

 

Lectures recommandées

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

 
hoz:


Je le fais et c'est facile ! Je n'ai pas pensé à une chose de plus, mais je vais vous donner l'idée complète.

Il ne devrait pas y avoir de limite au nombre d'ordres du tout. C'est-à-dire que les commandes peuvent être ouvertes dans n'importe quelle quantité... Peu importe leur nombre, mais un seul ordre doit être ouvert dans la barre actuelle. C'est tout.

C'est-à-dire qu'une nouvelle barre s'ouvre, nous pouvons donc ouvrir un ordre pendant cette barre, mais pas plus d'un ordre dans la barre actuelle. L'ordre suivant ne peut être ouvert que sur la barre suivante, pas avant.

C'est clair maintenant ?


Gardez à l'esprit que sur chaque barre, une seule position est ouverte.

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


ne garder qu'une seule position ouverte sur chaque barre

Vous ne pouvez pas faire ça. Si vous n'obtenez pas une condition au premier coup, l'heure entière sera perdue.
 
hoz:


Je vais rendre les choses claires et faciles ! Je n'ai pas encore pensé à une dernière chose, mais je vais vous donner l'idée complète.

Il ne devrait pas y avoir de limite au nombre d'ordres du tout. C'est-à-dire que les commandes peuvent être ouvertes dans n'importe quelle quantité... Peu importe leur nombre, mais un seul ordre doit être ouvert dans la barre actuelle. C'est tout.

C'est-à-dire qu'une nouvelle barre s'ouvre, nous pouvons donc ouvrir un ordre pendant cette barre, mais pas plus d'un ordre dans la barre actuelle. L'ordre suivant ne peut être ouvert que sur la barre suivante, pas avant.


Donc, dans ce cas
lastBarTime = iTime(NULL, 0, 0);              // На текущем баре все необходимые действия..
Nous ne pouvons ouvrir l'ordre sur la barre actuelle que si elle est ouverte, c'est-à-dire que nous devons déplacer cette ligne dans la fonction OpenBuy/Sell.