Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1228

 
Alexey Belyakov:

Mettez-le dedans. Je ne l'ai pas fait. Il s'ouvre par paquets. La magie - elle l'ignore.



Lorsque vous écrivez du code, traduisez sa logique en russe. Au début, il y a un cycle dans lequel des comparaisons sont faites et si l'ordre sélectionné n'est pas un ordre de marché, alors à l'itération suivante ; si le symbole n'est pas EURUSD, alors à l'itération suivante et si le magik n'est pas égal à votre magik, alors à l'itération suivante. À la fin du cycle, vous comptez le nombre d'itérations passées avant la fin du cycle. Le cycle se termine et le programme commence à ouvrir les commandes selon les conditions. Considérant que l'une des conditions est toujours vraie, un ordre est ouvert. Et cela se produit à chaque tic.

 
Valeriy Yastremskiy:

Lorsque vous écrivez le code, traduisez sa logique en russe. Vous avez d'abord un cycle dans lequel des comparaisons sont faites ; si l'ordre sélectionné n'est pas un ordre de marché, alors à l'itération suivante ; si l'instrument n'est pas l'Eurobucks, alors à l'itération suivante ; et si le magik n'est pas égal à votre magik, alors à l'itération suivante. À la fin du cycle, vous comptez le nombre d'itérations passées avant la fin du cycle. Le cycle se termine et le programme commence à ouvrir les commandes selon les conditions. Considérant que l'une des conditions est toujours vraie, un ordre est ouvert. Et cela se produit à chaque tic.

Je vois. Mais dans ce cas, si(OrderMagicNumber() == MagicNumber)continue, l'ordre qui a été placé est accepté pour un ordre placé par Magic(o). En d'autres termes, l'ordre placé manuellement sur EUROBAX doit être ignoré et un autre ordre doit être ouvert par un Expert Advisor avec Magic.

OrdersTotal() - c'est le problème qui met fin à toute manipulation avec Magic.
 
Alexey Belyakov:

Je comprends. Mais dans ce cas : if(OrderMagicNumber() == MagicNumber)continue ; Les ordres placés sont pris pour des ordres placés par Magic(s). C'est-à-dire qu'un ordre placé manuellement sur Eurobucks devrait être ignoré, et un autre devrait être ouvert par un EA avec Magic.

OrdersTotal() - c'est l'infestation qui met un terme à toute manipulation du magicien.

Le code est exécuté de haut en bas. Après la boucle, vous avez le placement des ordres. if(OrderMagicNumber() == MagicNumber)continue ; Ceci interrompra l'exécution du corps de la boucle et une nouvelle itération de la boucle commencera. La boucle se termine et la passation de la commande commence. C'est ainsi que vous l'avez écrit. Le nombre total de commandes n'a rien à voir avec cela. Si vous voulez faire une condition que s'il n'y a pas d'ordres placés avec votre magik et instrument, alors le code de placement d'ordre devrait être différent.

Passez en revue les numéros de commande. Si un ordre est trouvé avec notre magik et sur notre instrument, alors retour - sortie du départ. Ou un drapeau que votre ordre est là et au début ontik ou le début vérifier sur le drapeau.

Et il est préférable de créer un EA à partir d'un modèle pour créer un script EA, un indicateur. Les champs du code principal seront plus corrects.

datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;


int start()
{

int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >= 0; i--) 
{
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == "EURUSD" && OrderMagicNumber() == MagicNumber)return(0);
}
          

             
if ((Close[0]>High[1])&&(n==0))
{
send=OrderSend("EURUSD",OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,MagicNumber);
}

if ((Close[0]<Low[1])&&(n==0))  
{
send=OrderSend("EURUSD",OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,MagicNumber);
}

return(0);
}
 
Valeriy Yastremskiy:

Le code est exécuté de haut en bas. dans une boucle selon les règles de la boucle. Après la boucle, vous avez placé des commandes. if(OrderMagicNumber() == MagicNumber)continue ; Ceci interrompra l'exécution du corps de la boucle et une nouvelle itération de la boucle commencera. La boucle se termine et la passation de la commande commence. C'est ainsi que vous l'avez écrit. Le nombre total de commandes n'a rien à voir avec cela. Si vous voulez faire une condition que s'il n'y a pas d'ordres placés avec votre magik et instrument, alors le code de placement d'ordre devrait être différent.

Passez en revue les numéros de commande. Si un ordre est trouvé avec notre magik et sur notre instrument, alors retour - sortie du départ. Ou un drapeau que votre ordre est là et au début ontik ou le début vérifier sur le drapeau.

Et il est préférable de créer un EA à partir d'un modèle pour créer un script EA, un indicateur. Les champs du code principal seront plus corrects.

for(int i = OrdersTotal(); i >= 0; i--) 
{
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == "EURUSD" && OrderMagicNumber() == MagicNumber)return(0);
}

Je suppose que ce n'est pas la solution, mais dans quelle direction travailler ?

J'ai essayé une vingtaine de variantes. Soit ouvre un ordre, soit sans aucune interruption, tuyvukuchu.

Ici, d'ailleurs, sur OrderSekect - une variable de type bool doit être définie, sinon elle jure.

 
Alexey Belyakov:

Ce n'est pas une solution, mais quelle voie emprunter ?

J'ai déjà essayé une vingtaine de variantes. Soit l'ouverture d'un seul ordre, soit l'ouverture sans aucune interruption.

Ici, d'ailleurs, sur OrderSekect - une variable de type bool doit être définie, sinon elle jure.

Oui, il devrait, il ne retourne nulle part.

for(int i = OrdersTotal(); i >= 0; i--) 
{
     bool sel = OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == "EURUSD" && OrderMagicNumber() == MagicNumber)return(0);
}

Vous feriez mieux d'écrire l'algorithme, ce que vous voulez faire.

 
Alexey Belyakov:

Ce n'est pas une solution, mais quelle voie emprunter ?

J'ai déjà essayé une vingtaine de variantes. Soit l'ouverture d'un seul ordre, soit l'ouverture sans aucune interruption.

Ici, en passant, sur OrderSekect - une variable de type bool doit être définie, sinon elle jure.

Au lieu de return(0), on devrait dire continue.

 

Des personnes compétentes et bien informées ! Aide pour implémenter l'indicateur Enveloppes dans un EA MT5. L'EA lui-même doit traiter chaque tick (sans saut). J'ai essayé quelques variantes, j'ai regardé dans la documentation, je semble aimer la variante, mais c'est pour le handler OnCalculate. Je ne l'ai pas encore essayé avec la bibliothèque standard... Eh bien, voici ma mise en œuvre initiale :

input int       Indicatorperiod         = 3;
input double    EnvelopesDeviation      = 0.07;
int    handle;                                          //--- переменная для хранения хэндла индикатора iEnvelopes
double upperEnv[3], lowerEnv[3];                        // динамические массивы для хранения численных значений Emvelopes
double local_envelopesupper, local_envelopeslower;      // в эти переменные пытаюсь получить значения верхней и нижней линии индикатора
...

int OnInit()
...
handle=iEnvelopes(_Symbol,_Period,Indicatorperiod,0,MODE_LWMA,PRICE_OPEN,EnvelopesDeviation);
...

void OnTick()
...
//--- Объявляем структуру, которая будут использоваться
   MqlRates mrate[3];           // Будет содержать цены, объемы и спред для каждого бара
   ArraySetAsSeries(mrate, true); 

      //--- Получить исторические данные последних 3-х баров
      if(CopyRates(_Symbol,_Period,0,3,mrate)!=3)
        {
         Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
         return;
        }

      //--- Используя хэндлы индикаторов, копируем новые значения индикаторных буферов в массивы
      if(CopyBuffer(handle,0,0,3,upperEnv)<2 || CopyBuffer(handle,1,0,3,lowerEnv)<2)
        {
         Alert("Ошибка копирования буферов индикатора Envelopes - номер ошибки:",GetLastError(),"!!");
         return;
        }
...
local_envelopesupper = upperEnv[1];
local_envelopeslower = lowerEnv[1];
...

Dans le testeur visuel, j'obtiens :


Pouvez-vous me dire ce qui ne va pas et quelle est la meilleure façon de procéder ?
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Некорректное отображение индикатора
 
Valeriy Yastremskiy:

Oui, c'est censé jurer, ça ne retourne nulle part.

Vous feriez mieux d'écrire l'algorithme que vous voulez faire, ce n'est pas clair ce dont vous avez besoin.

Dans le premier message se trouve le code. C'est facile : on franchit le sommet/bas précédent - on ouvre une transaction. Les ordres ouverts par cet EA ne doivent pas croiser les autres ordres ouverts manuellement ou par un autre EA, c'est-à-dire que l'EA doit fonctionner indépendamment.

J'ai cherché partout sur Internet. Il s'agit d'un sujet plutôt banal, mais il existe de nombreuses variantes. Cela semble être une chose simple, et on ne la trouve nulle part.

 
Alexey Belyakov:

Dans le premier message, le code. C'est simple : casser le sommet/bas précédent - ouvrir une transaction. Les ordres ouverts par cet EA ne doivent pas se chevaucher avec d'autres ordres ouverts manuellement, ou avec ceux ouverts par un autre EA, c'est-à-dire que l'EA doit fonctionner indépendamment.

J'ai cherché partout sur Internet. Il s'agit d'un sujet plutôt banal, mais il existe de nombreuses variantes. Cela semble être une chose simple, et on ne la trouve nulle part.

Décrire le travail du conseiller expert dans son intégralité, étape par étape. La première étape consiste à vérifier s'il existe des ordres avec notre magik sur le symbole sélectionné. Si nous les avons, nous terminons notre travail et si nous ne les avons pas, nous fixons les ordres. Que se passe-t-il après que les commandes ont été passées ? C'est comme ça
 
Maxim Kuznetsov:

au lieu de return(0) la signification devrait être continue

Il y a des égaux, alors on ne va pas plus loin et on termine... Je n'aime pas ça, si ce n'est pas égal, alors continuez. C'est plus difficile à comprendre.
Raison: