[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 347

 

S'il vous plaît aidez-moi à améliorer ce code pour obtenir un simple Expert Advisor. L'essence est simple : nous ouvrons 2 positions Vendre et Bui avec des stops spécifiés au prix actuel. Puis, lorsque l'un ou les deux se déclenchent, nous ouvrons de nouvelles positions. L'essentiel semble simple mais cela ne fonctionne toujours pas Merci beaucoup !

//+------------------------------------------------------------------+
//| 2DiffOrders.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
extern double lots=0.01;
extern int SL_in_pips;
extern int TP_in_pips;
int x2;
int init()
{
if(SL_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && SL_in_pips>0)
{
SL_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Stoploss установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt.");
}
if(TP_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && TP_in_pips>0)
{
TP_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Takeprofit установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt.");
}
x2=1;
while(x2!=0)
{
if(OrderSend(Symbol(),0,lots,Ask,2,Bid-15*Point,Bid+15*Point,0)!=-1)
{
Alert("Ордер типа BUY успешно открыт");
OrderSend(Symbol(),1,lots,Bid,2,Ask+15*Point,Ask-15*Point,0);
x2=GetLastError();
if(x2==0)
Alert("Ордер типа SELL успешно открыт");
if(x2!=0)
Alert("Ордер типа SELL не открыт. Ошибка №: ",x2);
}else
{
x2=GetLastError();
if(x2!=0)
Alert("Ордер типа BUY не открыт. Ошибка №: ",x2);
}
}
//----
return(0);


Dossiers :
ala.mq4  3 kb
 
Reshetov >> :

Cela ne semble être qu'exactement correct, mais en vue machine, le dernier bit peut prendre des valeurs différentes. C'est-à-dire 2,9999, 3 ou 3,00000001.


Pour éviter de tels malentendus, il existe la fonction NormalizeDouble() dans MQL.

Oui, NormalizeDouble() aide, merci.

Mais on ne sait toujours pas comment cela est possible, il semble s'agir d'une simple division, et si vous divisez 0,5 ou 0,9 ou même 0,31 par 0,1, tout va bien.

et ici il a clairement 2.9, ce n'est pas clair... la calculatrice est plus précise :-)

Merci à Reshetov et splxgf pour leur aide.

 
mukata >> :


Mais on ne voit toujours pas comment c'est possible, cela semble être une simple division. Et si vous divisez 0,5 ou 0,9 ou même 0,31 par 0,1, c'est bon.

et ici c'est 2.9, c'est pas clair... la calculatrice est plus précise :-)


Les calculatrices ont des fonctions d'arrondi intégrées. Et ils se résolvent de la même manière car ils utilisent le même coprocesseur mathématique pour calculer les nombres à virgule flottante.

 

Bonjour !

Pouvez-vous s'il vous plaît me donner un indice ?!!!

Je ne comprends pas comment le faire moi-même.

Tâche :

EA passe 1 à 2 commandes par jour.

La valeur initiale de la variable est définie manuellement et peut prendre une valeur de 1 à 10.

Vous devez modifier la variable précédemment définie par incréments de 1 à une valeur de - 10

pour chaque jour ouvrable de l'EA, seulement par 1, si ce jour-là le TP n'est pas exécuté.

Lorsque TP est exécuté, la variable renvoie la valeur - 1.

Le comptage du SL ne convient pas, car il peut être de un ou deux, et la valeur ne peut être modifiée qu'une fois par jour.

I.e.

Variable = 1

Jour 1 SL - variable =2

Jour 2 SL - variable =3

Jour 3 SL - variable =4

Jour 4 TP - variable =1

Jour 5 SL - variable =2

... Et ainsi de suite.

Au secours !

Merci.

 
Enter писал(а) >>

S'il vous plaît aidez-moi à améliorer ce code pour obtenir un simple Expert Advisor. L'essence est simple : nous ouvrons 2 positions Vendre et Bui avec des stops spécifiés au prix actuel. Puis, lorsque l'un ou les deux se déclenchent, nous ouvrons de nouvelles positions. L'essentiel semble simple mais cela ne fonctionne toujours pas Merci beaucoup !

Eh bien pour le travail d'expert, la "viande" du conseiller devrait être placée dans la fonction de départ tout de même...
 

Connaisseurs, aidez-nous.

Il existe un code qui calcule un momentum d'une seule période et l'intègre avec une grande période, puis le sort comme un indicateur.

J'ai besoin d'écrire un indicateur avec une période donnée qui trouve la moyenne de la courbe résultante et la sort comme indicateur.

Le code est joint :

#propriété indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
#property indicator_width1 2

//------- Paramètres des indicateurs externes ----------------------------------------+
extern int MTM_Period = 1 ;
//extern int MTM_Integr_Period = 1000 ;

//extern int Applied_Price = 0 ; // Prix utilisé :
// 0 - PRIX_CLOSE
// 1 - PRIX_OUVERT
// 2 - PRIX_HAUT
// 3 - PRIX_BAS
// 4 - PRIX_MÉDIAN
// 5 - PRIX_TYPIQUE
// 6 - PRIX_PONDÉRÉ
extern NumberOfBars = 1000 ; // Nombre de barres (0-all)

//------- Tampons indicateurs ---------------------------------------------------+
double buf0[] ;

//+----------------------------------------------------------------------------+
//| Fonction d'initialisation de l'indicateur personnalisé |
//+----------------------------------------------------------------------------+
void init() {
SetIndexBuffer (0, buf0) ;
SetIndexEmptyValue(0, 0) ;
SetIndexLabel (0, "i-mtm_integr") ;
SetIndexStyle (0, DRAW_LINE) ;
}

//+----------------------------------------------------------------------------+
//| Fonction personnalisée de désinitialisation de l'indicateur |
//+----------------------------------------------------------------------------+
void deinit() {
Commentaire (") ;
}

//+----------------------------------------------------------------------------+
//| Fonction d'itération de l'indicateur personnalisé |
//+----------------------------------------------------------------------------+
void start() {
int LoopBegin, i,j, per=3 ;
double mtm, mtmsum ;

si (NumberOfBars==0) LoopBegin=Bars-1 ;
autre LoopBegin=NumberOfBars ;
LoopBegin=MathMin(LoopBegin, Bars-1) ;

for (i=LoopBegin ; i>=0 ; i--) {
mtm=Close[i]-Close[MTM_Period+i] ;
mtmsum=mtmsum+mtm ;
buf0[i]=mtmsum ;
}
/* for (i=LoopBegin-per;i>=per;i--){
mtm=Close[i]-Close[MTM_Period+i] ;
mtmsum[i]=0+mtm ;
for (j=per;j<=0;j--){
mtmsum[i]=0+mtmsum[i+j];
mtmsum[i]=mtmsum[i]/per ;
buf0[i]=mtmsum[i] ;
}
}*/
}
//+----------------------------------------------------------------------------+

 
VNG писал(а) >>

Connaisseurs, aidez-nous.

Il existe un code qui calcule un momentum d'une seule période et l'intègre à une grande période, puis le sort comme un indicateur.

J'ai besoin d'écrire un indicateur avec une période donnée qui trouve la moyenne de la courbe résultante et la sort comme indicateur.

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 DodgerBlue
#property indicator_color2 Red
#property indicator_width1 2

//------- Внешние параметры индикатора ----------------------------------------+
extern int MTM_Period = 1; 
//extern int MTM_Integr_Period = 1000; 

//extern int Applied_Price = 0; // Используемая цена:
// 0 - PRICE_CLOSE
// 1 - PRICE_OPEN
// 2 - PRICE_HIGH
// 3 - PRICE_LOW
// 4 - PRICE_MEDIAN
// 5 - PRICE_TYPICAL
// 6 - PRICE_WEIGHTED
extern int NumberOfBars = 1000; // Количество баров обсчёта (0-все)
extern int MA_Period=3;
extern int MA_Mode=0;

//------- Буферы индикатора ---------------------------------------------------+
double buf0[];
double MA[];
//+----------------------------------------------------------------------------+
//| Custom indicator initialization function |
//+----------------------------------------------------------------------------+
void init() {
  SetIndexBuffer (0, buf0);
  SetIndexEmptyValue(0, 0);
  SetIndexLabel (0, "i-mtm_integr");
  SetIndexStyle (0, DRAW_LINE);
  SetIndexBuffer (1, MA);
  SetIndexLabel (1, "MA");
  SetIndexStyle (1, DRAW_LINE);

}

//+----------------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+----------------------------------------------------------------------------+
void deinit() {
Comment("");
}

//+----------------------------------------------------------------------------+
//| Custom indicator iteration function |
//+----------------------------------------------------------------------------+
void start() {
  int LoopBegin, i, j, per=3;
  double mtm, mtmsum;

  if ( NumberOfBars==0) LoopBegin=Bars-1;
  else LoopBegin= NumberOfBars;
  LoopBegin=MathMin( LoopBegin, Bars-1);

  for ( i= LoopBegin; i>=0; i--) {
    mtm=Close[ i]-Close[ MTM_Period+ i];
    mtmsum= mtmsum+ mtm;
    buf0[ i]= mtmsum;
  }
  for ( i= LoopBegin- per; i>= per; i--){
     MA[ i]= iMAOnArray( buf0, 0, MA_Period, 0, MA_Mode, i);
  }
}
//+----------------------------------------------------------------------------+
Cette variante fera peut-être l'affaire. Je n'ai pas vérifié le code, je l'ai écrit dans le navigateur.
 
Reshetov >> :

Cela ne semble être qu'exactement correct, mais en vue machine, le dernier bit peut prendre des valeurs différentes. C'est-à-dire 2,9999, 3 ou 3,00000001.

Pour éviter de tels malentendus, MQL dispose de la fonction NormalizeDouble().


Pourquoi la fonction NormalizeDouble() ne s'exécute-t-elle pas par défaut pour toutes les valeurs de Ask, Bid, Low, etc.

Tout le monde est tombé dans le panneau et doit ensuite le réparer "manuellement"... C'est étrange que MT ne puisse pas lire ce qu'elle a elle-même engendré.

 
Silen >> :

Merci, y a-t-il une garantie que les données seront disponibles dans start() ?

vous pouvez essayer d'utiliser RefreshRates() - voir les exemples dans l'aide standard de MetaEditor

 

Il existe une option "Enregistrer comme rapport" dans l'optimisation de l'EA, mais les "paramètres d'entrée" ne sont pas affichés dans l'explorateur Internet,

bien que, à en juger par le code html, ils y soient présents. En général, c'est pour ces paramètres que l'optimisation a été lancée.

Peut-être que quelqu'un sait comment les voir dans Explorer ?


(Il est également possible de les copier dans un fichier texte par une commande séparée, mais il est préférable de les voir dans IE).

Raison: