Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 1105

 
shtr:

Wow ! !! Merci ! Cela demande une certaine réflexion.

Il y a peut-être une "autoformation" sur les nouvelles règles quelque part ? Le numéro de page à 4 chiffres est un peu stressant...

Qui est facile maintenant... Il y a 5 autres sujets de ce type sur les débutants dans l'archive )))).

Pour être honnête, les exemples de l'aide et de la codobase sont suffisants si vous avez déjà une expérience de la programmation, de préférence en C++. Si vous n'avez aucune expérience, vous pouvez d'abord jeter un coup d'œil au tutoriel C++, MQL est très similaire en termes de syntaxe.

 
evillive:

Qui a la vie facile maintenant... Il y a 5 autres sujets de ce type sur les débutants dans l'archive )))).

Pour être honnête, les exemples de l'aide et de la codobase sont suffisants si vous avez déjà une expérience de la programmation, de préférence en C++. Si vous n'avez aucune expérience, vous pouvez d'abord étudier un tutoriel C++, la syntaxe de MQL étant très similaire.

Pas d'expérience = tutoriel C++ ; ))))

Merci pour votre aide !

 

Bonjour, chers Messieurs !

Veuillez m'aider à ajouter une alerte à l'indicateur lorsqu'une flècheindiquant une paire de devises apparaît.

J'ai essayé moi-même, mais comme on dit, il est difficile de ne pas savoir et d'oublier. Merci d'avance.



#property indicator_chart_window

#property indicator_buffers 4

#property indicator_color1 White

#property indicator_color2 White

#propriété indicator_color3 LightGreen

#property indicator_color4 Red


extern int CountBars = 300 ;

extern string FS = " ** Sensibilité du filtre : High <-[1..3]-> Low ** " ;

extern int Sensitivity = 2 ;

double g_ibuf_92[] ;

double g_ibuf_96[] ;

double g_ibuf_100[] ;

double g_ibuf_104[] ;

int gi_unused_108 = -1 ;


int init() {

IndicatorBuffers(4) ;

SetIndexStyle(2, DRAW_ARROW) ;

SetIndexArrow(2, 233) ;

SetIndexBuffer(2, g_ibuf_92) ;

SetIndexStyle(3, DRAW_ARROW) ;

SetIndexArrow(3, 234) ;

SetIndexBuffer(3, g_ibuf_96) ;

SetIndexStyle(0, DRAW_HISTOGRAM, STYLE_SOLID, 3, White) ;

SetIndexBuffer(0, g_ibuf_100) ;

SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID, 3, White) ;

SetIndexBuffer(1, g_ibuf_104) ;

SetIndexEmptyValue(0, 0) ;

SetIndexEmptyValue(1, 0) ;

SetIndexEmptyValue(2, 0) ;

SetIndexEmptyValue(3, 0) ;

SetIndexLabel(2, "Signal d'achat") ;

SetIndexLabel(3, "Signal de vente") ;

SetIndexLabel(0, "High") ;

SetIndexLabel(1, "Low") ;

SetIndexEmptyValue(0, EMPTY_VALUE) ;

SetIndexEmptyValue(1, EMPTY_VALUE) ;

SetIndexEmptyValue(2, EMPTY_VALUE) ;

SetIndexEmptyValue(3, EMPTY_VALUE) ;

string ls_0 = "Scalper Signal" ;

IndicateurShortName(ls_0) ;

si (Sensibilité < 1) Sensibilité = 1 ;

si (Sensibilité > 3) Sensibilité = 3 ;

retour (0) ;

}


int deinit() {

retour (0) ;

}


double sellSignal(int ai_0) {

bool li_4 = TRUE ;

si (Sensibilité > 2)

si (iHigh(Symbol(), Period(), ai_0 + 6) >= iHigh(Symbol(), Period(), ai_0 + 5)) li_4 = FALSE ;

si (Sensibilité > 1)

si (iHigh(Symbol(), Period(), ai_0 + 5) >= iHigh(Symbol(), Period(), ai_0 + 4)) li_4 = FALSE ;

si (Sensibilité > 0)

si (iHigh(Symbol(), Period(), ai_0 + 4) >= iHigh(Symbol(), Period(), ai_0 + 3)) li_4 = FALSE ;

if (li_4) {

si (iClose(Symbol(), Period(), ai_0 + 2) < iHigh(Symbol(), Period(), ai_0 + 3)))

si (iClose(Symbol(), Period(), ai_0 + 1) < iLow(Symbol(), Period(), ai_0 + 3)) return (iHigh(Symbol(), Period(), ai_0 + 3) + 10.0 * Point)

}

retour (0) ;

}


double buySignal(int ai_0) {

bool li_4 = TRUE ;

si (Sensibilité > 2)

si (iLow(Symbol(), Period(), ai_0 + 6) <= iLow(Symbol(), Period(), ai_0 + 5)) li_4 = FALSE ;

si (Sensibilité > 1)

si (iLow(Symbol(), Period(), ai_0 + 5) <= iLow(Symbol(), Period(), ai_0 + 4)) li_4 = FALSE ;

si (Sensibilité > 0)

si (iLow(Symbol(), Period(), ai_0 + 4) <= iLow(Symbol(), Period(), ai_0 + 3)) li_4 = FALSE ;

if (li_4) {

si (iClose(Symbol(), Period(), ai_0 + 2) > iLow(Symbol(), Period(), ai_0 + 3)))

si (iClose(Symbol(), Period(), ai_0 + 1) > iHigh(Symbol(), Period(), ai_0 + 3)) return (iLow(Symbol(), Period(), ai_0 + 3) - 10.0 * Point)

}

retour (0) ;

}


int start() {

int li_0 = IndicatorCounted() ;

si (li_0 < 0) retourner (-1) ;

si (li_0 > 0) li_0-- ;

int li_4 = Bars - li_0 ;

for (int l_count_8 = 0 ; l_count_8 < li_4 ; l_count_8++) {

g_ibuf_92[l_count_8 + 3] = buySignal(l_count_8) ;

g_ibuf_96[l_count_8 + 3] = sellSignal(l_count_8) ;

si (buySignal(l_count_8) > 0.0 || sellSignal(l_count_8) > 0.0) {

g_ibuf_100[l_count_8 + 3] = iHigh(Symbol(), Period(), l_count_8 + 3) ;

g_ibuf_104[l_count_8 + 3] = iLow(Symbol(), Period(), l_count_8 + 3) ;

}

}

retour (0) ;

}

Dossiers :
 

Bonjour, creuseurs.

J'ai un peu de mal avec le résultat de l'historique des commandes.

Stratégie :

1-Ouvrir 2 ordres dans des directions différentes (lock en fait) avec un stop court et un profit long.

Si le prix sort régulièrement de la fourchette, il fera tomber le stop de l'un des ordres et cherchera à réaliser un profit long sur l'autre ordre.

3 - Lorsque le stop d'un des ordres est atteint, un ordre en attente est placé au niveau de son ouverture, et si le prix revient, l'ordre est réouvert.

et revenir à l'état de blocage avant le prochain mouvement vers le profit par l'abattage d'un stop court.

Objectif :

Pour tracer 3 coups d'arrêt, car au 4ème ordre, Martin est déclenché. Le problème est que quelque chose ne va pas. Je détermine la rentabilité de l'ordre par l'historique OrderProfit(),

Mais je ne comprends toujours pas comment fonctionne OrdersHistoryTotal(). La fonction vérifie-t-elle le numéro de commande ou la quantité de la commande ?

De la même manière, je ne comprends pas comment il interprète la suppression d'une position (soit comme une perte, soit comme rien du tout). Comment puis-je retracer 3 pertes consécutives dans une telle situation alors que l'historique montre beaucoup d'autres choses en plus des pertes ?

 
Fartarantula:

Bonjour, creuseurs.

J'ai un peu de mal avec le résultat de l'historique des commandes.

Stratégie :

1-Ouvrir 2 ordres dans des directions différentes (lock en fait) avec un stop court et un profit long.

Si le prix sort régulièrement de la fourchette, il fera tomber le stop de l'un des ordres et cherchera à réaliser un profit long sur l'autre ordre.

3 - Lorsque le stop d'un des ordres est atteint, un ordre en attente est placé au niveau de son ouverture, et si le prix revient, l'ordre est réouvert.

et nous retournons à l'état de position jusqu'au prochain mouvement vers le profit par le knock-out du stop court.

Objectif :

Pour tracer 3 coups d'arrêt, car au 4ème ordre, Martin est déclenché. Le problème est que quelque chose ne va pas. Je détermine la rentabilité de l'ordre par l'historique OrderProfit(),

Mais je ne comprends toujours pas comment fonctionne OrdersHistoryTotal(). La fonction vérifie-t-elle le numéro de commande ou la quantité de la commande ?

De la même manière, je ne comprends pas comment il interprète la suppression d'une position (soit comme une perte, soit comme rien du tout). Comment dois-je retracer les 3 pertes consécutives dans une situation comme celle-ci, lorsque l'historique montre beaucoup d'autres informations que les pertes ?

La première chose à retenir est qu'un ordre en suspens n'est pas une perte ; il s'est déclenché ou a été supprimé.

La perte doit être constatée sur les ordres de marché (Achat, Vente).

OrdersHistoryTotal() renvoie la quantité d'ordres dans l'historique de négociation disponible (y compris les dépôts et les retraits du compte, si le mode "historique complet" est choisi). Le nombre 0 correspond généralement au premier dépôt, c'est-à-dire à la première commande ; le nombre OrdersHistoryTotal()-1 correspond à la dernière commande de l'historique.

Cela signifie que nous devons parcourir en boucle les ordres du dernier au premier, tout en comptant les ordres en attente et les ordres perdus.

Mais pourquoi placer des ordres en attente si nous pouvons toujours attendre que le prix atteigne le niveau de l'ordre fermé au stop et ouvrir l'ordre immédiatement en fonction du marché ? Les ordres à cours limité sont un lien inutile dans ce cas, car ils embrouillent le compte.

 
Fartarantula: Stratégie :

1-Ouvrir 2 ordres dans des directions différentes (lock réel) avec un stop court et un profit long.

2-Si le prix se déplace régulièrement hors de la fourchette, il fera tomber le stop de l'un des ordres, et ira chercher un profit long sur l'autre ordre.

J'ai regardé votre stratégie avec les yeux d'un programmeur. Lorsque le prix monte, il atteint le SL de vente, il y a donc un ordre d'achat avec son SL et un TP quelque part au-dessus. Dans ce cas, vous avez réussi à obtenir une petite perte sur l'ordre fermé. Considérons maintenant la variante avec deux ordres en attente. Au lieu d'ouvrir deux ordres, plaçons deux ordres en attente sur les endroits mêmes où vous avez le SL. Lorsque le prix atteint le Buy Stopl, un ordre d'achat est ouvert et nous avons la même position, mais il n'y a pas de perte. Et maintenant, la chose la plus intéressante. Lorsque le prix augmente...

 

...Et comme le prix a augmenté sur votre principe, votre TP s'est éloigné. Et vous avez moins de chances que moi de prendre le bénéfice, si l'on considère nos actions sur le moment.

Et même si je ne trade pas en parallèle avec vous, votre TP est entre les pips, et le mien l'est en fait. Et ce sera toujours le cas - vous donnez au marché une partie du mouvement directionnel.

Si vous ne le savez pas, vous devez savoir que même un écart malheureux de 2 points transforme un système positif en un système perdant. À en juger par le premier chiffre, vous avez un écart d'environ 20 pips sur un écart de 5 chiffres,

car la différence entre les ordres placés simultanément "à l'œil" est de 40 pips selon la figure.

Ce n'est pas la question... vous avez besoin d'un extrait de code, la détection correcte d'une série de 3 arrêts frappés. Pourquoi tout le monde essaie-t-il de corriger le système ? Et la méthodologie du camarade susmentionné

ne fonctionnera pas non plus. Le marché peut simplement ne pas vous laisser ouvrir, ou ouvrir là où vous ne devriez pas. Mec, je vous comprends tous, et votre désir de partager vos expériences. Mais j'ai juste besoin de tracer trois arrêts.

Tout est en place, je viens juste de voir que j'ai raté le mauvais ordre avec un double. Il s'est avéré qu'Histototal donnait ce qu'il jugeait bon, et que la boucle de détermination d'un ordre fermé par la perte de l'historique manquait l'ordre.

 
Fartarantula Tout est sur la ligne, je viens de voir accidentellement que j'ai glissé le mauvais ordre avec le doublement. Il s'est avéré qu'Histototal donnait ce qu'il jugeait bon, et la boucle de détermination d'un ordre fermé par la perte de l'historique a manqué l'ordre.

Vous devez vous éloigner de la qualification de codeur et apprendre les bases de la programmation. Voici plus de détails... Et ici.

Voilà le problème. Ce qui revient, comme le dit l'auteur, Histototal dans ce texte sur le même compte le dimanche.

void OnStart()
{
  Alert("Cчет " + DoubleToStr(AccountNumber(), 0),
        "  Дата ", TimeToStr(TimeLocal(),TIME_DATE),
        "  Ордеров ", OrdersHistoryTotal());
}

Pourquoi différent ?

S'il y a moins et plus de commandes sur un même compte, alors 0 228 228 216 98... Et s'il y a moins de commandes, le traitement est plus rapide !

Le client transpire - il est impossible de travailler, le terminal est défaillant, Histototal a donné ce qu'il voulait, la boucle a sauté !

 

Bonjour à tous. Aidez-moi à relever les flèches dans l'indicateur, celles du bas sont correctes, mais celles du haut sont au-dessus des chandeliers.

J'ai essayé ObjectSet(Arrow_name_jack1, OBJPROP_YDISTANCE,20) ; cela n'a pas fonctionné. Le point d'ancrage de la flèche (objet) est en haut, comment puis-je le déplacer vers le haut ?

//display signal arrow 
      RefreshRates(); 
   
      if(   (High[i+1]  >upBuffer[i+1] ) 
         && (Close[i+1] >Open[i+1]     ) 
         && (Close[i]   <Open[i]       ) 
        )            
      {  //draw a dot on top of the bar
         string Arrow_name_jack1 = "AboveTopBand_SellBar_jack1_" + TimeToStr(Time[i],TIME_DATE|TIME_SECONDS);  //TimeCurrent()
         ObjectCreate(Arrow_name_jack1, OBJ_ARROW, 0, Time[i], High[i]+iATR(NULL,0,20,i)/5);//5*pips);  //OBJ_ARROW=22,window=0,
//???????????? так не получилось         //  ObjectSet(Arrow_name_jack1, OBJPROP_YDISTANCE,20);
            ObjectSet(Arrow_name_jack1, OBJPROP_ARROWCODE, 242          );  //159
            ObjectSet(Arrow_name_jack1, OBJPROP_COLOR,     Yellow    );  //Magenta
            ObjectSet(Arrow_name_jack1, OBJPROP_STYLE,     STYLE_SOLID  );
            ObjectSet(Arrow_name_jack1, OBJPROP_WIDTH,     2            ); 
            
      }
      else
      if (   (Low[i+1]   <dnBuffer[i+1] ) 
          && (Close[i+1] <Open[i+1]     ) 
          && (Close[i]   >Open[i]       ) 
         )            
      {  //draw a dot on top of the bar
          Arrow_name_jack1 = "BelowBotBand_BuyBar_jack1_" + TimeToStr(Time[i],TIME_DATE|TIME_SECONDS);//TimeCurrent()
         ObjectCreate(Arrow_name_jack1, OBJ_ARROW, 0, Time[i], Low[i]-iATR(NULL,0,20,i)/5);//5*pips);  //OBJ_ARROW=22,window=0,
            ObjectSet(Arrow_name_jack1, OBJPROP_ARROWCODE, 241          );//159
            ObjectSet(Arrow_name_jack1, OBJPROP_COLOR,     Yellow   );//Magenta
            ObjectSet(Arrow_name_jack1, OBJPROP_STYLE,     STYLE_SOLID  );
            ObjectSet(Arrow_name_jack1, OBJPROP_WIDTH,     2            ); 
      }
   }//end for(i = limit; i >= 0; i--)
 
mikanit:

Bonjour à tous. Aidez-moi à relever les flèches dans l'indicateur, celles du bas sont correctes, mais celles du haut sont au-dessus des chandeliers.

J'ai essayé ObjectSet(Arrow_name_jack1, OBJPROP_YDISTANCE,20) ; cela n'a pas fonctionné. Le point d'ancrage de la flèche (objet) est en haut, comment le déplacer vers le haut ?

ObjectSetInteger(0,Arrow_name_jack1,OBJPROP_ANCHOR,ANCHOR_BOTTOM) ;

Je recommande d'utiliser des variables distinctes pour stocker les noms des flèches supérieures et inférieures, afin d'éviter toute confusion.

Et oui, dessiner des flèches dans l'indicateur avec des objets est une perversion. Il existe des tampons indicateurs:

SetIndexStyle(0,DRAW_ARROW,0,1,clrRed);

    SetIndexArrow(0,242);