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 .
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) ; } //+------------------------------------------------------------------+
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...
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 ?
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).
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.
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é.
externdouble TakeProfit = 150;
externdouble Sl = 150;
externdouble Lots = 0.1;
externint 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());
elsePrint("Ошибка при открытии 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());
elsePrint("Ошибка при открытии 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();
elsebreak;
}
}
}
elsePrint( "Error when order select ", GetLastError());
//----
}
}
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
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 ...
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é ?
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).
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
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é.