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

 

Dratuti. Comment faire un panneau comme celui-ci ?

 
Andrey Sokolov:

Dratuti. Comment faire un panneau comme celui-ci ?

Prenez l'exemple de kodobase et refaites-le, il y a plein de conseillers avec des panneaux pour tous les goûts. Cela commence par le contexte
 
Andrey Sokolov:

Dratuti. Comment faire un panneau comme celui-ci ?

Avec des objets graphiques.
 
Andrey Sokolov:
Vitaly Muzichenko,Artyom Trishkin, merci.
Nzt
 
trader781:

Continuer à écrire un autre piggybacking sur martingale, perdre même dans le testeur, sinon comment faire pousser un élan.

Il existe actuellement un paramètre souhaité, qui devrait être responsable de la possibilité d'ouvrir la commande suivante après que la ou les commandes précédentes aient été fermées.

il y a 2 scénarios

1) si la valeur est vraie

ouvrir une commande

processus

fermer

et rouvrir

2) si faux

Ouvrir la commande

Processus

Fermer

et ensuite faire ExpertRemove

le problème est que ces deux conditions s'excluent mutuellement, mais qu'elles doivent être combinées en 1 EA puisque

1) la valeur est fixée au départ

2) la valeur est fixée dans les conditions d'entrée et de traitement et acceptée pour le traitement (si vrai, ouvert)

3) après la fermeture, nous mettons le faux

Si quelqu'un s'intéresse à ces choses, je serais heureux d'entendre mes variantes.
J'ai des problèmes avec la logique.

C'est simple :

  1. ouvrir une commande
  2. traiter la commande
  3. fermer la commande
  4. Vérifiez l'état et...
    • si vrai, alors ExpertRemove()
  5. Encore une fois
 
Artyom Trishkin:
Nous avons des problèmes de logique.

Tout est simple :

  1. ouvrir une commande
  2. traiter la commande
  3. fermer la commande
  4. vérifier l'état et...
    • si vrai, alors ExpertRemove()
  5. et le faire à nouveau
Quelque chose ne va pas, si c'est vrai - il faut couper un chou, pas aller dans les buissons).
 
Vitaly Muzichenko:
Quelque chose ne semble pas normal, si c'est vrai - vous devriez être en train de couper du chou, pas dans les buissons).
Faux. Faux. Je ne sais pas quel est le test... Merde, il y a encore de la logique dans tout ça.
Ou vous voulez juste discuter ?
 

Veuillez me conseiller. Le conseiller expert n'ouvre pas d'ordres dans le terminal. La compilation est en cours, selon les graphiques les ordres devraient être ouverts. Mais ils ne le sont pas. Je joins le code.

double Lots=NormalizeDouble((AccountFreeMargin()/100*Percent)/MarketInfo(Symbol(),MODE_MARGINREQUIRED),1);//déterminer le nombre de lots
double MacdCurrent=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,0);// paramètres MACD de la barre actuelle
double MacdPrevious1=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,1);//les paramètres MACD de la barre précédente
double MacdPrevious2=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,2);//les paramètres MACD de la ligne principale décalés de 2 barres
double StopLoss=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,0);//Paramètres Trailing Stop par paramètres ParabolicSAR de la barre courante
double Previous_StopLoss=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);/Paramètres du StopLoss par les paramètres ParabolicSAR de la barre précédente
double PSARCurrent=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,0);//paramètres ParabolicSAR de la barre courante
double PSARPrevious=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);//ParabolicSAR de la barre précédente
//+------------------------------------------------------------------+
//| Fonction tick expert|
//+------------------------------------------------------------------+
void OnTick()
{
static datetime New_Time=TimeCurrent();// Heure de la barre actuelle
bool New_Bar=false ; // Marque une nouvelle barre.
int ticket,total,cnt ;
//---------------------------------------------------------------------------
{
New_Bar=false ; // Pas de nouvelle barre.
if(Time[0]==New_Time) // Compare les temps
{
New_Bar=true ; // La nouvelle barre est prise en compte.
if(New_Bar==false) // Si une barre n'est pas nouvelle
return ; // ...puis sortie
}
}
total=OrdersTotal();// Détermination du nombre de commandes
si(total<1)
{
//---pas d'ordres ouverts
if((AccountFreeMargin()/100*Percent)<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT))
//Contrôle de la disponibilité des fonds pour ouvrir le lot minimum
{
Print("Pas assez de fonds. Fonds libres = ",AccountFreeMargin()) ;
retour ;
}

//-- condition pour l'ouverture d'une position longue (BUY)
si((MacdCurrent>0 && MacdPrevious1<=0 && MacdPrevious2<0)
&&
PSARCurrent<iOpen(NULL,0,1))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss,0,NULL,MAGICNUMBER,0,Green) ;
if(ticket>0)//vérification de la position ouverte
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Ordre BUY ouvert : ",OrderOpenPrice()) ;
sinon
Print("BUY order open error : ",GetLastError()) ;
retour ;
}
}

//-- condition pour l'ouverture d'une position courte (SELL)
if((MacdCurrent<0 && MacdPrevious1>=0 && MacdPrevious2>0)
&&
PSARCurrent>iOpen(NULL,0,1))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,StopLoss,0,NULL,MAGICNUMBER,0,Red) ;
if(ticket>0)//vérification de la position ouverte
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("Ordre de vente ouvert : ",OrderOpenPrice()) ;
sinon
Print("Erreur lors de l'ouverture d'un ordre de VENTE : ",GetLastError()) ;
retour ;
}
}
//--- sortir du bloc "aucun ordre ouvert".

}
//--il est important d'entrer correctement sur le marché mais il est encore plus important d'en sortir correctement.
for(cnt=0;cnt<total;cnt++)
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
if(OrderMagicNumber()==MAGICNUMBER && // vérifier le numéro magique de la commande
OrderSymbol()==Symbol()) // vérification du symbole de l'ordre
{
//--- position longue ouverte
si(OrderType()==OP_BUY)
{
//--- doit être fermé ?
if((MacdCurrent<0 && MacdPrevious1>=0 && MacdPrevious2>0)
&&
PSARCurrent>iOpen(NULL,0,1))
{
//--- ordre de fermeture et de sortie
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
Print("OrderClose error ",GetLastError()) ;
retour ;
}
//------------------Modifier l'ordre par StopLoss
if(StopLoss>Previous_StopLoss && StopLoss<iOpen(NULL,0,0))
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Previous_StopLoss,0,0,Blue))
Print("Erreur de modification de commande. Code d'erreur=",GetLastError()) ;
sinon
Print("Le prix du Stop Loss de l'ordre a été modifié avec succès ;)
retour ;
}
}

else // aller court
si(OrderType()==OP_SELL)
{
//--- doit être fermé ?
si((MacdCurrent>0 && MacdPrevious1<=0 && MacdPrevious2<0)
&&
PSARCurrent<iOpen(NULL,0,1))
{
//--- ordre de fermeture et de sortie
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
Print("OrderClose error ",GetLastError()) ;
retour ;
}
//-----------------Modifier l'ordre par StopLoss
if(StopLoss<Previous_StopLoss && StopLoss>iOpen(NULL,0,0))
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Previous_StopLoss,0,0,Blue))
Print("Erreur de modification de commande. Code d'erreur=",GetLastError()) ;
sinon
Print("Le prix du Stop Loss de l'ordre a été modifié avec succès ;)
retour ;
}
}
}

//-------------------------------------------------------------------------------------------------------

 
trader781:

Oui, c'est plus simple que ça.

mais que se passe-t-il si nous gardons ceci comme solution de repli et faisons ce qui suit

vérifier l'état et...
  • si c'est vrai, alors le bot s'arrête avec une activité minimale, de préférence pas du tout

c'est-à-dire comment bloquer l'entrée pour la suite des opérations.

return(0) ; mais ce n'est pas souhaitable - il ne gérera rien d'autre.
Raison: