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

 
costy_:
Il

existe de nombreuses options, par exemple l'enregistrement des temps d'ouverture dans un fichier, mais il est plus facile de faire défiler les ordres ouverts et de comparer les durées de vie.

En général, il faut reformuler .

..

"Il est nécessaire de fermer toutes les positions ouvertes après un intervalle de temps

spécifié" pour chaque position individuelle (c'est ainsi que j'ai compris la question). merci ! Le mot "plus facile" dans votre réponse est le mot clé, il signifie qu'il n'y a pas de telle fonction intégrée. Je voulais juste fermer chaque position individuelle 2 heures après son ouverture .
 
costy_:

Le script ne trouvera pas l'heure du testeur aussi facilement (mais l'indicateur le fera), vous pouvez joindre le conseiller de test au départ.

rapidement et de manière fiable ...

Merci. Je l'ai fait dans le script comme ça :
    datetime time_start=GlobalVariableGet( "Time_test");
//    Alert(iBarShift(NULL,0,time_start)); 
    EndBar =  iBarShift(NULL,0,time_start);
Tout fonctionne.
 

J'essaie d'écrire un inikator. Je ne comprends pas pourquoi il redessine. De plus, il ne fait que tirer sur le rendu. Aidez-moi, s'il vous plaît. Je suis novice en matière de programmation.

#property indicator_chart_window
#property indicator_buffers 2
#propriété indicator_color1 Magenta
#property indicator_color2 Red
//---- paramètres d'entrée
extern int N ;
datetime some_time=D'1971.01.11 00:00' ;
datetime some_time_1=D'1971.01.11 00:00' ;
//---- tampons
double RLB_Buffer[] ;
double RLB_Buffer_1[] ;
double Real_Line_Balanse=0,x=0,last_high,last_low,RLB, Real_Line_Balanse_1=0,x1=0,last_high_1,last_low_1,RLB_1 ;
bool dirlong,first ;
int i,ii,bar_high,bar_low,first_t_bar,now_bar,first_t_bar_1,now_bar_1 ;
//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'indicateur personnalisé |
//+------------------------------------------------------------------+
int init()
{
string short_name ;
//---- ligne d'indicateurs
SetIndexStyle(0, DRAW_ARROW) ;
SetIndexArrow(0, 159) ;
SetIndexBuffer(0,RLB_Buffer) ;
//---- ;
SetIndexStyle(1, DRAW_ARROW) ;
SetIndexArrow(1,159) ;
SetIndexBuffer(1,RLB_Buffer_1) ;
retour(0) ;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted() ;
Commentaire(i," ",ii) ;
//----
si(Barres < 3)
retour(0) ;
//----------
first_t_bar=iBarShift(NULL,0,some_time,false) ; //les barres tendent vers le haut
now_bar=iBarShift(NULL,0,TimeCurrent(),false) ; //dernière barre, la plus à droite
i=counted_bars-first_t_bar+1 ;
//------------
first_t_bar_1=iBarShift(NULL,0,some_time_1,false) ; //barre de début de tendance
now_bar_1=iBarShift(NULL,0,TimeCurrent(),false) ; //dernière barre, la plus à droite
ii=counted_bars-first_t_bar_1+1 ;
// si(IsVisualMode()==TRUE) i=first_t_bar-counted_bars-1 ; //si(counted_bars), alors la barre de début de tendance
si(barres comptées == 0)
{
premier = faux ;
i=première_t_barre+1 ;
ii=première_t_barre_1+1 ;
}
//------------ //barres négatives comptées
dirlong = faux ;
if(iMA(NULL,0,1,0,MODE_SMA,PRICE_MEDIAN,0)>iMA(NULL,0,2,0,MODE_SMA,PRICE_MEDIAN,0))dirlong = true ;
if(dirlong == true) //si la tendance est à la hausse
{
while(i>=0)
{
x++ ; //compte des barres depuis le début de la tendance
Real_Line_Balanse=Close[i+5] ; //compte de la somme des ralentissements de la tendance
RLB=Real_Line_Balanse ;
if(RLB<Low[1]) RLB_Buffer[i]=Real_Line_Balanse ; //affiche la ligne seulement si le prix est en hausse
//-------
if(RLB>Close[i]&& x>50) //si le prix a franchi la RLB de haut en bas
{
bar_high=iHighest(NULL,0,MODE_HIGH,first_t_bar,now_bar);//puis déterminer HIGH entre
//dernière barre et début de la tendance
some_time_1=Time[bar_high] ; //nouveau début de la tendance à la baisse
x=0 ; //remise à zéro du compteur de barres depuis le début de la tendance
Real_Line_Balanse=0 ;
}
i-- ;
}//while
//-------
}//dirlong
//---------------------
//---------------------
if(dirlong == false) //si la tendance est à la baisse
{
while(ii>=0)
{
x1++ ; //compte des barres depuis le début de la tendance
Real_Line_Balanse_1=Close[ii+10] ; //compte le nombre de barres de la tendance
RLB_1=Real_Line_Balanse_1 ;
if(RLB_1>High[1]) RLB_Buffer_1[ii]=Real_Line_Balanse_1 ;
//-------
if(RLB_1<Close[ii]&& x1>50) //si le prix a franchi la RLB de haut en bas
{
bar_low=iLowest(NULL,0,MODE_LOW,first_t_bar_1,now_bar_1);//puis déterminer le LOW entre
//dernière barre et début de la tendance
some_time=Time[bar_low] ; //nouveau début de la tendance à la hausse
x1=0 ; //remise à zéro du compteur de barres depuis le début de la tendance
Ligne_réelle_Balanse_1=0 ;
}
ii-- ;
} //while
//-------
}//dirlong
//---------------------
retour(0) ;
}
//+------------------------------------------------------------------+

 

C'est absurde. Au lieu de

i=counted_bars-first_t_bar+1 ;

J'ai mis en place un design qui compte les barres qu'il compte lui-même. TOUT a commencé à fonctionner sans problème. IndicatorCounted() ; glitches ou je ne comprends pas...

 

comment informer une variable sur le statut d'un ordre clôturé ?


avatar
2
vitaluxa 29.10.2011 21:26
Bonjour !

Si un EA a ouvert un ordre et qu'il s'est fermé sur le Stop Loss ou le Take Profit, comment puis-je informer la variable que l'ordre s'est fermé exactement sur le Stop Loss ou le Take Profit ?
Merci d'avance !
 
001:

C'est absurde. Au lieu de

i=counted_bars-first_t_bar+1 ;

J'ai mis en place une construction qui compte les barres comptées elle-même. TOUT se passe bien. IndicatorCounted() ; glitches ou je ne comprends pas...

Vous utilisez while(i>=0), donc lorsqu'une nouvelle bougie apparaît, i=1 (pour s'assurer que les données de la bougie précédente sont comptées par les données enregistrées une fois).

Pourquoi entrer some_time=D'1971.01.11 00:00' ; utiliser Bars , IndicatorCounted ne fonctionne pas pour moi (enfin, l'erreur est probablement due à la first_t_bar).

Votre algorithme et vous devriez le réparer.

"Je suis nouveau dans la programmation."Depuis 2007).

 
sergeev:

comment informer une variable sur le statut d'un ordre clôturé ?


:)

+ ...

Pour Vitaluha :

https://docs.mql4.com/ru/trading/OrderStopLoss

https://docs.mql4.com/ru/trading/OrderTakeProfit

 
Bonjour, pourriez-vous me dire pourquoi les devis du 10 juin au 22 septembre de cette année ne peuvent être téléchargés ? J'ai effectué deux ou trois téléchargements d'historique et tous présentent le même écart dans les données.
 
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Закрвает открытые позиции через 2 суток
void DelOldPositions()                                    
{   
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
    {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
        {
         if (OrderOpenTime()+2*24*60*60  > TimeCurrent())  
          {
           OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,4 ),3,Red);
          }
        }
   }
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
Помогите поправить 2 последние строки, т.к. в тестере почему-то  мгновенно  закрывает все открытые позы. С уважением.
 

Le problème est que l'EA rouvre constamment des ordres, c'est-à-dire qu'il y a un signal d'achat - il ouvre un ordre, puis le ferme à profit, et les conditions sont toujours préservées il l'ouvre à nouveau.

Je pensais que cela pouvait être géré avec le traditionnel compteur d'achat et de vente - si un ordre d'achat a été ouvert, le compteur +1 et un nouvel achat ne peut être ouvert tant que le compteur n'est pas à 0 et le compteur n'est remis à zéro que lorsqu'il est fermé.

extern double TakeProfit = 150;
extern double Sl = 150;
extern double Lots = 0.1;
extern int n = 9;     
        
//-----------------------------------------------------------

int start()
 {
  int cnt, ticket, total, i, Buy=0, Sell=0;
  double x1=iIchimoku(NULL,0,9,26,52,MODE_TENKANSEN,0);   //красная
  double x2=iIchimoku(NULL,0,9,26,52,MODE_KIJUNSEN,0);    //синяя
  double x3=iIchimoku(NULL,0,9,26,52,MODE_SENKOUSPANA,0); //фиол пунктир
  double x4=iIchimoku(NULL,0,9,26,52,MODE_SENKOUSPANB,0);  //кр пунктир
  double x5=iIchimoku(NULL,0,9,26,52,MODE_CHINKOUSPAN,0);  //зеленая
  double x6=Ask;
  double x61=Bid;
  double Lot=0;  
  total=OrdersTotal();
  
  for (i=total-1;i>=0;i--)   //счетчик выставленных ордеров
   { 
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
       {
         if(OrderType()==OP_BUY)
          { 
           Buy++;
            }  
          if (OrderType()==OP_SELL)
           { 
            Sell++;
             }  
        }
     }
  if(total<1)//проверка количества ордеров 
   {
    
         if(AccountFreeMargin()<(100*Lots))
              {
     Print("Недостаточно средств = ", AccountFreeMargin());
     return(0);  
               }

         if (x6>x3 && x6>x4 && x1>x2 && x6>x2 && x6<(x2+60) && Buy==0) //бай
               {
                   ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-Sl*Point,Ask+TakeProfit*Point,0,0,0,Green); Sell=0; // ордер и обнуление счетчика
                      if(ticket>0)
                      {
                         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("открыта позиция BUY : ",OrderOpenPrice());
      
                         else Print("Ошибка при открытии BUY позиции : ",GetLastError()); 
                        }
              }
   
         if (x6<x3 && x6<x4 && x1<x2 && x6<x2 && x6>(x2-60) && Sell==0) //селл 
                {
                   ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+Sl*Point,Bid-TakeProfit*Point,0,0,0,Red); Buy=0; //сам по себе ордер и обнуление счетчика 
                     if(ticket>0)
                     {
                         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("открыта позиция SELL : ",OrderOpenPrice());
    
                         else Print("Ошибка при открытии SELL позиции : ",GetLastError());
      
                      } 
    
                  }
  
  
  } 

   if((OrderType()==0 && x61<x3 && x61<x4 && x1>x2 && x1>x3 && x1>x4) || (OrderType()==1 && x61>x3 && x61>x4 && x1<x2 && x1<x3 && x1<x4)) //закрытиеи на развороте
      {
          bool   result;
          double price;
          int    cmd,error;
//----
          if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
              {
                  cmd=OrderType();
                  if(cmd==OP_BUY || cmd==OP_SELL)
                    {
                      while(true)
                        {
                         if(cmd==OP_BUY) price=Bid;
                         else            price=Ask;
                         result=OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
                         if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
                         else error=0;
                         if(error==135) RefreshRates();
                         else break;
                        }
                     }
               }
          else Print( "Error when order select ", GetLastError());
//----
          
      }
 
 }
 
 
Dossiers :
Raison: