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

 
Maxim Kuznetsov:

if (time[i]>=time_m1 && time[i]<time_m1+PeriodSeconds(PERIOD_M1) {

  // время time[i] попало внутрь бара открытого в time_m1

}

OK) une flèche, mais par cette condition à M15 et plus la flèche est fixée à 21:00

 if(time[i]>=StringToTime("2019.04.22 20:55:00") && time[i]<StringToTime("2019.04.22 20:55:00")+Period()*PeriodSeconds(PERIOD_M1))

et si vous utilisez simplement+PeriodSeconds(PERIOD_M1) sansPeriod()*, il n'est pas du tout défini)

 
yiduwi:

OK) une flèche, mais par cette condition à M15 et plus la flèche est fixée à 21:00

Et si vous utilisez simplement+PeriodSeconds(PERIOD_M1) sansPeriod()*, il n'est pas du tout défini).

Lisez la documentation :-) Period() ne renvoie que l'identifiant de la période en cours - pourquoi le multiplier ?

au lieu de PERIOD_M1 (qui est donné comme exemple), passez-le à PeriodSeconds( Period() ) - puis obtenir le nombre de secondes dans une barre de la période actuelle.

 
kopeyka2:

Voilà pour l'énigme du "parallélépipède des Bermudes".

Cela fonctionne pour moi :) J'ai même essayé d'ouvrir/fermer le terminal.

PS : Artyom, tu as déplacé la question sur le cinq vers le quatre... Je l'ai trouvé par hasard.

 
kopeyka2:


EMA ligne 20 23.04.2019 00:00

Lors de la mise en route de MT5, SANS connexion en ligne, le message "array out...." apparaît immédiatement.

Les erreurs varient, mais sont toujours présentes. Peut se reproduire en ligne, mais est plus souvent présent lorsque le MT est allumé.


Tel est le mystère du "parallélépipède des Bermudes".

le message d'erreur indique le numéro de la ligne où l'erreur s'est produite. Commencez à creuser à partir de là
 
Igor Zakharov:

Cela fonctionne pour moi :) J'ai même essayé d'ouvrir/fermer le terminal.

PS : Artyom, tu as déplacé la question sur le cinq vers le quatre... Je l'ai trouvé par hasard.

C'est un thème commun - nous aidons ici non seulement avec MQL4, mais aussi pour la migration vers MQL5. C'est donc dans le thème.

 
Veuillez me conseiller sur la manière d'écrire le code d'un EA qui prend les prix des transactions dans un fichier texte .csv. Pourquoi cette question : à chaque tick, l'EA compare le prix actuel avec le prix dans le fichier .csv, qui est lu entièrement par une boucle dans la fonction fileopen, si je comprends bien. Mais le fichier contient plus de 5000 lignes pour l'année dernière, chaque ligne contient le nom de l'instrument, le prix, le type de transaction (achat/vente), la date d'enregistrement, la date d'annulation de l'ordre. Lors du test, le conseiller expert parcourra en boucle toutes les lignes du fichier à chaque tick pour comprendre s'il est temps de passer un ordre ? Ou, pour tester, devrions-nous faire en sorte que notre EA définisse tous les ordres avec la date d'annulation en une seule fois pendant l'initialisation et vérifier les ordres réels par leur date d'expiration à chaque tick pour le trading réel ? Peut-être que ce n'est pas du tout ce que j'attendais. Peut-être que c'est la bonne chose à faire du point de vue des ressources ou qu'il y a d'autres variantes (par exemple, nous devrions faire des objets graphiques et comparer le prix actuel avec eux, mais il semble que ce soit le même cycle) ; veuillez me conseiller.
 

Bonjour !


J'ai téléchargé le tutoriel vidéo de programmation MQL4.

J'ai créé un Expert Advisor en suivant la leçon.

Mais ça ne marche pas quand je fais du commerce.

Je n'ai pas d'erreur en le compilant.

Comme je suis au début de mon voyage, il est difficile de trouver l'erreur jusqu'à présent.

Je demande de l'aide si quelqu'un peut m'aider.

Merci !

Code :

/+----Входные параметры----------------+

extern inttern BarCount=10 ;

extern int int HourStart=14 ;

extern double Lots=0.1 ;

extern int StopLoss=120 ;

extern int TakeProfit=300 ;

extern int Magic=1456 ;

//+------------Глобальные переменные----------------+

double minprice=999999,mp,

maxprice=-99999,SL,TP;

int ticket ;

//+------------------------------------------------------------------+

//| Fonction d'initialisation de l'expert |

//+------------------------------------------------------------------+

int OnInit()

{

return(INIT_SUCCEEDED) ;

}

//+------------------------------------------------------------------+

//| Fonction de désinitialisation experte |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{


}

//+------------------------------------------------------------------+

//| fonction tick expert |

//+------------------------------------------------------------------+

void OnTick()

{

GetMinPrice() ;

GetMaxPrice() ;


if(TimeHour(TimeCurrent())==HourStart)

{

if(BuyLimitCount()&& BuyCount() ==0)

{

SL=NormalizeDouble(minprice-StopLoss*Point,5) ;

TP=NormalizeDouble(minprice+TakeProfit*Point,5) ;

ticket=OrderSend(Symbol(),OP_BUYLIMIT,Lots,minprice,5,SL,TP,"",Magic,0,Blue) ;

si(ticket<0)

Print("Échec de l'ouverture de la limite d'achat") ;

}

si(SellLimitCount()&& SellCount()==0)

{

SL=NormalizeDouble(maxprice+StopLoss*Point,5) ;

TP=NormaliserDouble(maxprice-TakeProfit*Point,5) ;

ticket=OrderSend(Symbol(),OP_SELLLIMIT,Lots,maxprice,5,SL,TP,"",Magic,0,Red) ;

si(ticket<0)

Print("Echec de l'ouverture de la limite de vente") ;

}

}



Comment("MinPrice : "+DoubleToStr(minprice,5)+"\n "+"MaxPrice : "+DoubleToStr(maxprice,5)) ;


}

//+FONCTION PERMETTANT DE DÉFINIR LE PRIX MINIMUM SUR LE NUMÉRO DE BARRE BARCOUNT

void GetMinPrice()

{

for(int i=0 ; i<BarCount ; i++)

{

mp=iLow(Symbol(),PERIOD_CURRENT,i) ;

si(mp<minprice)

minprice=mp ;

}

retour ;

}

//+FONCTION DE DÉTERMINATION DU PRIX MAXIMUM SUR LE NOMBRE DE BARREAUX

void GetMaxPrice()

{

for(int i=0 ; i<BarCount ; i++)

{

mp=iHigh(Symbol(),PERIOD_CURRENT,i) ;

si(mp>maxprice)

maxprice=mp ;

}

retour ;

}

//+FONCTION DU NOMBRE D'ORDRES LIMITES OUVERTS À ACHETER

int BuyLimitCount()

{

int count=0 ;

for(int i=OrdersTotal()-1 ; i>=0 ; i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderType()==OP_BUYLIMIT)

{

compte++ ;

}

}

return(count) ;

}

//+-FONCTION DU NOMBRE D'ORDRES LIMITÉS DE VENTE OUVERTS

int SellLimitCount()

{

int count=0 ;

for(int i=OrdersTotal()-1 ; i>=0 ; i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderType()==OP_SELLLIMIT)

{

compte++ ;

}

}

return(count) ;

}

//+FONCTION DU NOMBRE D'ORDRES EN CARNET SUR LE MARCHÉ OUVERT

int BuyCount()

{

int count=0 ;

for(int i=OrdersTotal()-1 ; i>=0 ; i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderType()==OP_BUY)

{

compte++ ;

}

}

return(count) ;

}

//+-FONCTION DU NOMBRE D'ORDRES DE VENTE SUR LE MARCHÉ OUVERT

int SellCount()

{

int count=0 ;

for(int i=OrdersTotal()-1 ; i>=0 ; i--)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderMagicNumber()==Magic && OrderType()==OP_SELL)

{

compte++ ;

}

}

return(count) ;

}

//+------------------------------------------------------------------+


//+------------------------------------------------------------------+

 

Seric29

Merci, je vais ajouter vos informations à mes bagages.

 
WinProject:
Pouvez-vous me conseiller sur la manière d'écrire le code d'une EA qui prend les prix des transactions à partir d'un fichier .csv ? Pourquoi cette question : A chaque tick, l'EA va comparer le prix actuel avec le prix dans le fichier .csv, qui est lu entièrement par la fonction fileopen, si je comprends bien. Mais le fichier contient plus de 5000 lignes pour l'année dernière, chaque ligne contient le nom de l'instrument, le prix, le type de transaction (achat/vente), la date d'enregistrement, la date d'annulation de l'ordre. Lors du test, le conseiller expert passera en boucle toutes les lignes du fichier à chaque tick pour comprendre s'il est temps de passer un ordre ? Ou, pour les tests, devrions-nous faire en sorte que notre EA définisse tous les ordres avec la date d'annulation en une seule fois pendant l'initialisation et vérifier les ordres réels par leur date d'expiration à chaque tick pour le trading réel ? Peut-être que ce n'est pas du tout ce à quoi je m'attendais. Peut-être que c'est la bonne chose à faire du point de vue des ressources ou qu'il y a d'autres variantes (par exemple, nous devrions faire des objets graphiques et comparer le prix actuel avec eux, mais il semble que ce soit le même cycle) ; je ne comprends pas, veuillez me conseiller.

En général, on essaie de lire (écrire) dans le fichier le moins de fois possible.

Pour votre tâche, il serait préférable de lire les données dans un tableau au chargement (bien qu'il soit probablement plus pratique de les lire dans une structure), puis de comparer les valeurs actuelles du prix et du temps avec les valeurs du tableau.

SZY : recherche sur la base de code "file" ou "csv" était autrefois de tels Expert Advisors prêts à l'emploi - lire à partir d'un fichier échanger sur les données

 
Igor Makanu:

En général, on essaie de lire (écrire) dans le fichier le moins de fois possible.

Pour votre tâche, il serait préférable de lire les données dans un tableau au chargement (bien qu'il soit probablement plus pratique de les lire dans une structure), puis de comparer les valeurs actuelles du prix et du temps avec les valeurs du tableau.

ZS : recherche sur le codebase "file" ou "csv" était autrefois de tels EAs prêts à l'emploi - lire à partir d'un fichier échanger sur ces données.

Merci beaucoup, j'ai obtenu la réponse que je voulais.

Raison: