[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 277

 
drknn:


Avez-vous regardé ici ? https://book.mql4.com/ru/samples/index

En général, comme tout autre programme, le vôtre sera constitué de blocs séparés, chaque bloc effectuant une tâche. Vous prenez un de ces blocs et vous écrivez votre propre code, vous le déboguez et vous passez ensuite au bloc suivant. Et ainsi de suite jusqu'à la fin du programme.

Merci...
 
evillive:

Bonjour !

Veuillez me conseiller sur un moyen fiable d'identifier un appartement, si tant est qu'il y en ait un.

C'est le cas. Je vais facturer pour de vrai cette semaine en me basant sur ça.
 
evillive:

Bonjour !
Veuillez me conseiller sur un moyen fiable d'identifier un appartement, si tant est qu'il y en ait un.

Un flat est un mouvement de prix composé d'un ou plusieurs éléments plats.
Un élément plat est un élément du mouvement du prix formé lorsque le prix se déplace dans n'importe quelle direction à partir de son point de départ avec retour ultérieur du prix à ce point.

 

Pour la livraison de la commande, la commande suivante est utilisée

tikett= OrderSend( Symbol(), OP_SELLSTOP,  volume*A, Price -otstup*Point, Point* 3,R2, Price-takeprofit*Point-otstup*Point, "OP_SELLSTOP" , 2000,  expiration,C'0,128,255' );

La commande OrderSend commande au robot de passer l'ordre ; la paire de devises est écrite entre parenthèses en première position. Ici, nous avons Symbol() qui nous donne la paire de devises où le conseiller expert a été placé. Il est suivi du nom de l'opération commerciale. Ensuite, nous avons le volume du lot et nous avons un multiplicateur variable ici. Prix, puis un écart de 3 pips, Stop Loss, Take Profit, nom, nombre magique - n'importe quel nombre que vous avez choisi, puis je ne sais plus, puis couleur. Tout est dans cet ordre. Vous pouvez vous passer de tikett=, juste de OrderSend.

Et ici, faites attention ! L'ordre sera placé à chaque tick, jusqu'à des centaines d'ordres, si c'est juste écrit au départ. Nous avons besoin de conditions pour que la commande soit passée quand cela est nécessaire. Exemple.

for ( i=OrdersTotal();i>0;i--){ OrderSelect(i-1,SELECT_BY_POS );//Alert ("OrderType( )", OrderType( ));
 if( OrderMagicNumber( )==2000 &&OrderSymbol()==Symbol()) { 
if(OrderType( ) ==OP_SELLSTOP) { Y++;}
if(OrderType( ) ==OP_SELL) { Y++;}}}
Y=Y-dolivka1;//Alert ("Y++", Y," dolivka1 ",dolivka1);
 if (Y<=0){ // Alert ("Y", Y );
   tikett= OrderSend( Symbol(), OP_SELLSTOP,  volume*A, Price -otstup*Point, Point* 3,R2, Price-takeprofit*Point-otstup*Point, "OP_SELLSTOP" , 2000,  expiration,C'0,128,255' );
   // Alert ("OP_SELLSTOP", GetLastError( )); 
    Error=GetLastError( ); } J=0;

   if (Error !=0 ) { Print ( " Error OP_SELLSTOP " , Error , "tikett",tikett," volume*A ",volume*A," Price -otstup*Point ",Price -otstup*Point," Price-takeprofit*Point-otstup*Point ",Price-takeprofit*Point-otstup*Point, 
  " Ask ", Ask , " Bid " , Bid );
   Error=0;}

Fatigué. Utilisez l'aide, pour analyser les exemples prêts.

 
drknn:


Vous l'avez vu ici ? https://book.mql4.com/ru/samples/index

En général, comme tout autre programme, le vôtre sera constitué de blocs séparés, chaque bloc effectuant une tâche. Nous prenons un de ces blocs et écrivons notre propre code, le déboguons de bout en bout et passons ensuite au bloc suivant. Et ainsi de suite jusqu'à la fin du programme.


Eh bien, je vais essayer d'être plus précis... Mon conseiller expert ouvre avec succès UN ordre en attente et il doit le modifier après un certain temps... Pour ce faire, j'ai besoin de connaître son indice ou un numéro de position dans un ordre en attente. Comment puis-je obtenir ce numéro de position ou son index ? Doit-on rechercher les commandes à l'aide d'une boucle for ? J'ai UNE commande... Voici une partie du code de mon programme qui ne fonctionne pas


si (OrderSelect (1, SELECT_BY_POS, MODE_TRADES)==true)

{ticket = OrderTicket() ;

retour();}

Comment l'écrire correctement ?

 
AlexLaptist:


Et pourtant, je vais essayer de poser la question plus précisément... Mon conseiller expert ouvre avec succès UN ordre en attente et après un certain temps, il doit le modifier... Pour ce faire, nous devons connaître son indice ou un numéro de position dans les ordres en attente. Comment puis-je obtenir ce numéro de position ou son index ? Doit-on rechercher les commandes à l'aide d'une boucle for ? J'ai UNE commande... Voici une partie du code de mon programme qui ne fonctionne pas


si (OrderSelect (1, SELECT_BY_POS, MODE_TRADES)==true)

{ticket = OrderTicket() ;

retour();}

Comment l'écrire correctement ?


La fonction OrderSend(), si elle est exécutée avec succès, renvoie le numéro du ticket de l'ordre qu'elle vient d'ouvrir - il s'agit de son numéro de séquence sur le serveur, et il n'existe aucun autre ordre de ce type. Il n'est donc pas nécessaire d'effectuer un retracement de l'ordre, il suffit de se souvenir de son ticket. Il suffit de s'en souvenir dès l'ouverture de la commande.

int Ticket=OrderSend();
if(Ticket<0){
// тут принтуем сообщение об ошибке.
}
// Вам нужно всё равно создать счётчик ордеров, который обнулит переменную Ticket в том случае, если ордера в рынке больше нет.
 
drknn:


La fonction OrderSend(), si elle est exécutée avec succès, renvoie le numéro du ticket de commande qu'elle vient d'ouvrir - il s'agit de son numéro de série sur le serveur et il n'existe aucune autre commande de ce type. Il n'est donc pas nécessaire d'effectuer un retracement de l'ordre, il suffit de se souvenir de son ticket. Il suffit de s 'en souvenir dès l'ouverture de la commande.

Et combien de temps se souviendra-t-on de lui ? Tu pourrais le perdre...

IMHO - nous devrions toujours prendre des informations fraîches et actualisées au fur et à mesure que nous en avons besoin, plutôt que de les stocker en mémoire, en fonction de l'occasion.

Il serait préférable de trouver la bonne commande avant de la modifier plutôt que d'espérer la chance... Au cas où le courant ne serait pas coupé, par exemple...

 
AlexLaptist:


Et pourtant, je vais essayer de poser la question plus précisément... Mon conseiller expert ouvre avec succès UN ordre en attente et après un certain temps, il doit le modifier... Pour ce faire, nous devons connaître son indice ou un numéro de position dans les ordres en attente. Comment puis-je obtenir ce numéro de position ou son index ? Doit-on rechercher les commandes à l'aide d'une boucle for ? J'ai UNE commande... Voici une partie du code de mon programme qui ne fonctionne pas


si (OrderSelect (1, SELECT_BY_POS, MODE_TRADES)==true)

{ticket = OrderTicket() ;

retour();}

Comment l'écrire correctement ?

Peut-être que ça donne quelque chose comme ça :

//+----------------------------------------------------------------------------+
int TicketLastSetOrder(string sy, int mn) { // 
   datetime t;
   int      i, op, ticket=-1;
   for (i=0; i<OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS)) {
         op=OrderType();
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (op<2 || op>5)             continue;
         if (OrderOpenTime()>t)  {
            t=OrderOpenTime();
            ticket=OrderTicket();
            }
         }
      else Print("FUNC TicketLastSetOrder(): Error select order: "+GetLastError());
      }
   return(ticket);
}
//+----------------------------------------------------------------------------+

Retourne le ticket du dernier ordre fixé ou -1

Lors de votre appel, veuillez préciser le symbole requis et le magik de l'EA, par exemple :

   int TicketMyOrder=TicketLastSetOrder(Symbol(), Magic);

Cette fonction renvoie le ticket du dernier ordre en attente passé sur le symbole actuel (le seul dans votre cas). Magic - le nombre magique de votre EA

 

Vous pourriez également placer le billet dans des variables globales. :) Vous pouvez tout à fait rouler dessus. Mais comme idée, la sélection de l'ordre avant la modification fonctionnera. Seulement s'il n'est pas nécessaire de réinitialiser les lots une seule fois pour toute la durée de vie de la commande (avec une seule modification) :) :).

En bref, il y a beaucoup de variantes :)

 

S'il vous plaît, donnez-moi un indice. Je n'ai pas encore compris le fonctionnement des indicateurs. Mon indicateur ne s'affiche pas lorsque je change de période, et il s'affiche de temps en temps. Mais parfois, c'est le cas, et cela fonctionne exactement comme je le voulais ! Dites-moi ce dont il a besoin.

//+------------------------------------------------------------------+
//|                                            ИндюкДимонакомпил.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#import "user32.dll"
   int   PostMessageA(int  hWnd,int  Msg,int  wParam,string lParam);
#import
#define WM_COMMAND                     0x0111
int delimiter = 0;

#property indicator_chart_window

#property indicator_buffers 3
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_color3 DarkBlue
double ВерхняячертаBuffer1[];
double НижняячертаBuffer2[];
double СинняячертаBuffer3[];
 double вершина; 
 double основание_первого_снижения;
 double начало;
 double вершина_волны_3;
 extern int T=4,K=200;
 int timeframe, start ;
 int бар_вершина ;
 int бар_основание_первого_снижения;
 int бар_начало;
int pereklutsatel;
double naklon,linija2; int P;extern int RO=-1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators

SetIndexStyle(0,DRAW_SECTION,STYLE_SOLID,2,CLR_NONE);//Alert ("SetIndexStyle ",GetLastError( ) );
  SetIndexBuffer(0,ВерхняячертаBuffer1);//Alert ("SetIndexBuffer ",GetLastError( ) );
   SetIndexEmptyValue(0,0.0);
   
   SetIndexStyle(1,DRAW_SECTION,STYLE_SOLID,2,CLR_NONE);//Alert ("SetIndexStyle ",GetLastError( ) );
  SetIndexBuffer(1,НижняячертаBuffer2);//Alert ("SetIndexBuffer ",GetLastError( ) ); 
   SetIndexEmptyValue(1,0.0);
   
   SetIndexStyle(2,DRAW_SECTION,STYLE_SOLID,T,CLR_NONE);//Alert ("SetIndexStyle ",GetLastError( ) );
  SetIndexBuffer(2,СинняячертаBuffer3);//Alert ("SetIndexBuffer ",GetLastError( ) ); 
   SetIndexEmptyValue(2,0.0);
   
   
  ObjectDelete("вершина");
  ObjectDelete("основание_первого_снижения  ");
   ObjectDelete("начало");
    ObjectDelete("точка4");
    ObjectDelete("пятая_точка!");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   ObjectDelete("вершина");
  ObjectDelete("основание_первого_снижения  ");
   ObjectDelete("начало");
    ObjectDelete("точка4");
    ObjectDelete("пятая_точка!");
   ObjectsDeleteAll(WindowOnDropped( ) , OBJ_TEXT);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit=Bars-counted_bars-1;

   for (int i=limit;i>=0;i--) {
//----
 for ( int J=0;J<=RO;J++){
//----

  // for(int i=Bars; i>=0;i--)
   i=Bars;
      бар_вершина=iHighest( NULL,  timeframe, MODE_HIGH, K, start ) ;
       вершина =High[ бар_вершина ];
       бар_основание_первого_снижения=iLowest( NULL,  timeframe, MODE_LOW,NormalizeDouble ( бар_вершина/2,0), start ) ;
       основание_первого_снижения=Low[ бар_основание_первого_снижения ];
       бар_начало=iLowest( NULL,  timeframe, MODE_LOW,NormalizeDouble (бар_вершина*1.5,0), бар_вершина ) ;
       начало=Low[ бар_начало ];
       
   ObjectCreate( "вершина",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_вершина],  вершина+(10*Point)) ; 
    ObjectSetText( "вершина", "вершина", 5, "вершина",Crimson ) ;// Alert("GetLastError()",GetLastError());
      // ObjectSet(  "вершина",  OBJPROP_COLOR, Crimson) ;
      
   ObjectCreate( "основание_первого_снижения",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_основание_первого_снижения],  основание_первого_снижения-(10*Point)) ; 
    ObjectSetText( "основание_первого_снижения", "основание_первого_снижения", 5, "основание_первого_снижения",Crimson ) ;   
   
    ObjectCreate( "начало",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_начало],  начало-(10*Point)) ; 
    ObjectSetText( "начало", "начало", 5, "начало",Crimson ) ;   
           
  if(начало>основание_первого_снижения){naklon=(начало-основание_первого_снижения)/(бар_начало-бар_основание_первого_снижения);
 // Alert("naklon  ", naklon);
    НижняячертаBuffer2[бар_начало]=начало;linija2=начало;for(i=бар_начало-1;i>=0;i--){linija2=linija2-naklon;
   
    НижняячертаBuffer2[i]=linija2;  // Alert ("linija2  " , linija2 ); 
     Alert("НижняячертаBuffer2[i]  ", НижняячертаBuffer2[i] , "  i " , i);
     
   }
    НижняячертаBuffer2[бар_основание_первого_снижения]=основание_первого_снижения;}
    
    
         for (i=0;i<100;i++){  СинняячертаBuffer3[i]= Open[i];}
          for (i=330;i<500;i++){  СинняячертаBuffer3[i]= Open[i];}

     ВерхняячертаBuffer1[бар_начало]=начало;
     
 double точка4; int бар_точка4;   бар_точка4=iHighest( NULL,  timeframe, MODE_HIGH, бар_основание_первого_снижения, 3 ) ; 
  точка4 =High[ бар_точка4 ];  
   
   if(вершина>точка4){naklon=(начало-точка4)/(бар_начало-бар_точка4);
   ObjectCreate( "точка4",  OBJ_TEXT , WindowOnDropped( ) , Time[бар_точка4],  точка4+(10*Point)) ; 
    ObjectSetText( "точка4", "точка4", 5, "точка4",Crimson ) ;  
   double linija1=начало;for(i=бар_начало-1;i>=0;i--){linija1=linija1-naklon;ВерхняячертаBuffer1[i]=linija1; }}
   
double vulf=НижняячертаBuffer2[0];
  if ( vulf==Ask||vulf==Bid){vulf=1;}
 if (vulf+(10*Point)>Ask&&vulf-(10*Point)<Bid){vulf=1 ;} 
           
      Alert ("vulf  " , vulf );   Comment ("  vulf!!! "  , vulf);  
   if (vulf==1){Comment ("  Есть вульв!!! "  , "  timeframe " , timeframe);
   ObjectCreate( "пятая_точка!",  OBJ_TEXT , WindowOnDropped( ) , Time[0],  Bid-(10*Point)) ; 
    ObjectSetText( "пятая_точка!", "пятая_точка!", 5, "пятая_точка!",Crimson ) ;   return(0);  }
    if (vulf!=1) {    
   
     if(delimiter<3){delimiter++;Comment(delimiter);return(0);}
   delimiter=0;
    fChangePeriod();P++;
                                 
                   }  } }
//----
   return(0);
  }
//+------------------------------------------------------------------+

void fChangePeriod(){int ii,hwd = WindowHandle(Symbol(),Period());
   switch(Period()){
      case PERIOD_W1    : ii = 33134; break; //PERIOD_D1;
      case PERIOD_D1    : ii = 33136; break; //PERIOD_H4;
      case PERIOD_H4    : ii = 33135; break; //PERIOD_H1;
      case PERIOD_H1    : ii = 33140; break; //PERIOD_M30;
      case PERIOD_M30   : ii = 33139; break; //PERIOD_M15;
      case PERIOD_M15   : ii = 33138; break; //PERIOD_M5;
      case PERIOD_M5    : ii = 33137; break; //PERIOD_M1;
      case PERIOD_M1    : ii = 33141; break; //PERIOD_W1;
   }     
   PostMessageA(hwd, WM_COMMAND, ii, 0);
   return;
}
Raison: