[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 13

 
keekkenen >> :

Le problème est que la fonction OrderClose() qui ferme l'ordre prend le numéro d'ordre comme premier paramètre, et le numéro d'ordre ne peut être obtenu qu'en appelant OrderSelect() sur des ordres existants, donc dans le cas général la fermeture ressemble à ceci...


Si OrdersTotal() = 0, c'est-à-dire s'il n'y a pas d'ordres ouverts, la boucle for se termine immédiatement.



Merci pour la réponse, pouvez-vous écrire le début de la fonction OrderSend ? Elle doit se placer juste après les dernières parenthèses ????.

 
vadim2304 >> :

Merci pour la réponse, pouvez-vous écrire le début de la fonction OrderSend ? Elle doit se placer juste après les dernières parenthèses ????.

Eh bien, voici un exemple

#define              OP_BALANCE     6
int                  TRY            = 1;     
int                  TRADESLEEP     = 1000;  
int                  SLIPPAGE       = 3;

int start(){
   //  ничего не делать   
   int action = OP_BALANCE;

   if ( isTime(Period()*60)) {
      // закрываем ордера по текущему инструменту
      closeAllOrdersBySymbol( SLIPPAGE, TRY, TRADESLEEP);
   
   // получаем условие покупать, продавать, ничего не делать   
   action = getAction();
   
   if ( action== OP_BALANCE) return(0);
   
   // для примера минимальный лот   
   double lots = MarketInfo(Symbol(),MODE_MINLOT);
   
   //количество пунктов для стоплоса и текпрофита - сами определите
   int slPoint = 0, tpPoint = 0;
      
   string сomment = "";// значение для комментария по умолчанию
   int magicNumer = 0;// значение по умолчанию
   
   // открываем позицию - while используется для того чтобы открывать позицию пока она не откроется
   while(! openOrder( action, lots, slPoint, tpPoint, SLIPPAGE, сomment, magicNumer, TRY, TRADESLEEP)){}
   }
   return(0);     
}   
//+------------------------------------------------------------------+
//|  открывает  позицию по рынку                                     |
//+------------------------------------------------------------------+
int getAction(){
   int act = OP_BALANCE;
   
   /* здесь нужно написать логику, 
      если что-то, то покупать act = OP_BUY;
      если что-то, то продавать act = OP_SELL;   
   */
   return( act);
}
//+------------------------------------------------------------------+
//|  открывает  позицию по рынку                                     |
//+------------------------------------------------------------------+
bool openOrder(int type, double lots, int slPoint, int tpPoint, int slippage, string comment, 
               int magicNumer, int try, int tradeSleep){    
   bool res = false;
   int err = 0;   
   double price, tp = 0, sl = 0, ask = 0, bid = 0;  
   color col = CLR_NONE;
   Comment("Открытие ордера...");      
   
   while ( try != 0){
      while (IsTradeContextBusy() || !IsTradeAllowed()) {Comment("Торговый поток занят...");Sleep( tradeSleep);}        
      RefreshRates(); 
      ask = MarketInfo(Symbol(),MODE_ASK);
      bid = MarketInfo(Symbol(),MODE_BID);   
      if ( type==OP_BUY)  {
         price = ask; col = Red;
         if ( slPoint > 0) sl = bid - slPoint*Point; 
         if ( tpPoint > 0) tp = ask +  tpPoint*Point;
      }
      
      if ( type==OP_SELL) {
         price = bid; col = Blue;
         if ( slPoint > 0) sl = ask + slPoint*Point; 
         if ( tpPoint > 0) tp = bid - tpPoint*Point;   
      }           
            
      if ( type==OP_BUY && AccountFreeMarginCheck(Symbol(),OP_BUY, lots) <= 0 || GetLastError()==134) 
         {Comment("Недостаточно свободных средств !"); Sleep(2000);return( res);}
      if ( type==OP_SELL && AccountFreeMarginCheck(Symbol(),OP_SELL, lots) <= 0 || GetLastError()==134)
         {Comment("Недостаточно свободных средств !"); Sleep(2000);return( res);}            
      
      res = OrderSend(Symbol(), type, lots, price, slippage, sl, tp, comment, magicNumer,0, col);
      if ( res!=-1){    
         PlaySound("alert.wav");    
         try = 0;                          
         Comment("Ордер открыт !");          
      }else{
         err = GetLastError();
         if ( err > 1) try = 0;
         Comment("Ошибка - ", err);          
      }  
      Sleep(2000);       
   }  
   return( res);
}
//+------------------------------------------------------------------+
//|  закрытие одеров
//+------------------------------------------------------------------+  
bool closeAllOrdersBySymbol(int slippage,int try, int tradeSleep){
   int k = OrdersTotal(), err, nextTry;
   string msg = "";
   bool res = false;  
   
   for (int i = 0; i < k; i++) {
      if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES) &&
         OrderSymbol()==Symbol()){ 
         nextTry = try;            
         while ( nextTry != 0){
            while (IsTradeContextBusy() || !IsTradeAllowed())
               {Comment("Торговый поток занят ...");Sleep( tradeSleep);}               
            res = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(), slippage,CLR_NONE);
            if ( res){                      
               nextTry = 0;
               res = true;    
               Comment("Ордер закрыт !");              
            }else{                                                          
               if ( err > 1) nextTry = 0;  
               Comment("Ошибка - ", err);        
            }                            
         }                         
      }
   }  
   return( res);
}
//+------------------------------------------------------------------+  
bool isTime(int sec){
   bool res = false;
   static datetime time = 0;
   double min = 0;
   if (TimeCurrent() >= time){
      min = MathFloor( sec / 60);
      if ( min==0) min = 1.0;         
      time = iTime(NULL,PERIOD_H1,0) + (MathFloor(Minute()/ min) + 1) * min * 60;
      res = true;
   } 
   return( res);
}
 
Question simple aux programmeurs :

Pouvez-vous me dire quelle fonction renvoie la valeur du niveau de marge (en pourcentage) pour les ordres ouverts, qui est affichée dans l'onglet "Trade" ?

Dans l'aide, aucune des fonctions énumérées ne renvoie cette valeur.

AccountMargin

AccountFreeMargin
AccountFreeMarginCheck
AccountFreeMarginMode
 
khorosh >> :

L'indicateur Damiani_Volt peut être utilisé.

C'est intéressant, merci.

 
keekkenen >> :
c'est là

Merci.

 
satop >> :

Qu'est-ce qui vous fait penser que je suis en colère ?

C'est juste ma façon d'expliquer que

en prenant tout signe d'inégalité et en courant

>> dans le testeur, vous pouvez obtenir un

le résultat avec un certain niveau, et peu importe quel niveau

positive ou négative. Et quand on lui demande

s'il faut prendre le niveau avec ou sans le moins,

il n'y a pas de distinction claire, malheureusement.


J'ai peut-être fait une erreur..........

Le problème est que le débutant demande ce qu'il NE SAIT PAS. Cet exemple de code sert à comprendre la structure (structure correcte) de l'EA.

Et ce qui est intégré dans ce morceau de code est construit sur un principe de trading CLASSIQUE. Tant le conseiller expert lui-même que les échantillons de code sont utilisés pour étudier les principes, et non pour titiller quelqu'un ou le prendre en défaut........ Après tout, vous DEVEZ comprendre théoriquement quoi et comment. Et puis créer, sculpter, inventer........

 
Pouvez-vous me dire s'il est possible de sortir un jpeg sur un graphique ?
 
keekkenen 25.02.2009 11:34 1) Veuillez expliquer, la fonction OrderSend(...) a un type int, et vous la définissez comme un type bool, alors que le type bool n'a pas de valeur -1, est-ce correct ? 2) Dans la fonction KimIV d'ouverture de position la répétition se fait par for(...), alors que dans la vôtre par while(...). quelle est la meilleure façon selon vous ?
 

1. il s'agit d'une erreur... res devrait être déclarée comme int et une autre variable de type bool devrait être ajoutée pour renvoyer la valeur succès/échec de l'ouverture de l'ordre....

2. j'ai également utilisé une des implémentations de la fonction OpenPosition() d'Igor plus tôt, mais j'ai ensuite modifié la fonction pour faciliter la détection et le signalement des erreurs...

le résultat est la structure suivante

while ( try != 0){
      // определение условий для открытыия позиции
      //..
     
      // открытие позициц
      res = OrderSend(...);
      
      if ( res > 0){ 
         PlaySound("alert.wav");    
         try = 0;                          
         Comment("Ордер открыт !"); 
         Sleep(2000);       
         ret = true;
      }else{
         /* блок определения ошибок и возврат 
          err - уровень критичности ошибки (0,1,2,3) 
          msg - описание ошибки (если showErrors = true)
          уровни определяются по номеру ошибки
          0-нет ошибки, 1-надо ждать и обновлять,
          2-сделка бракуется,3-фатальная ошибка*/
          
         ErrorBlock( showErrors, err, msg);
         if ( err > 1) try = 0;// в данном случае 2 и 3 критичны
         Comment("Ошибка - ", msg); 
         Sleep(2000);         
      }             
   }  
 
Si je comprends bien dans votre fonction, s'il y a des requêtes continues, alors le nombre de tentatives est illimité, contrairement à la fonction d'Igor ? Une limitation est-elle nécessaire dans ce cas ?