Questions des débutants MQL4 MT4 MetaTrader 4 - page 70

 
Bonjour, Pourriez-vous m'aider à écrire une fonction dans MT4. Je connais le solde de mon compte, je sais combien de transactions seront ouvertes (par exemple 9), je connais le risque (par exemple 3% du solde du compte), je dois calculer un lot pour la première transaction, si chaque lot suivant sera doublé et si toutes les transactions se chevaucheront.
//Функция расчета торгового лота
double GetLots()
{
 double clots = 0.0;
 double cl = NormalizeDouble(MarketInfo(Symbol(),MODE_MAXLOT),2); 
 double L2 = NormalizeDouble(cl * Multipler,2);
 double L3 = NormalizeDouble(L2 * Multipler,2);
 double L4 = NormalizeDouble(L3 * Multipler,2);
 double L5 = NormalizeDouble(L4 * Multipler,2);
 double L6 = NormalizeDouble(L5 * Multipler,2);
 double L7 = NormalizeDouble(L6 * Multipler,2);
 double L8 = NormalizeDouble(L7 * Multipler,2);
 double L9 = NormalizeDouble(L8 * Multipler,2);
 
 for(cl = NormalizeDouble(MarketInfo(Symbol(),MODE_MAXLOT),2);AccountFreeMarginCheck(Symbol(),OP_BUY,L9) <= (AccountBalance()/100)*Risk;cl--)
 {
  if(!IsStopped()) 
  {
   clots = NormalizeDouble(cl,2);
  }
 } 
 return(clots);
}

C'est ce que j'ai obtenu. S'il vous plaît, dites-moi ce qui ne va pas. Merci d'avance !

 

Bonjour !

J'écris ici car il ne semble y avoir personne sur mq4.

Pouvez-vous me dire ce que je fais mal ? L'option 2 ne fonctionne pas.

double A[][10];
int renge_A_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_A_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)

double B[][10];
int renge_B_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_B_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)
int count_B=0;

//+------------------------------------------------------------------+
//| Вариант 1. Копируем строки "А" в "В" без изменений               |
//+------------------------------------------------------------------+
void Fun_1()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         count_B++;
         ArrayResize(B, count_B);
         for(int j=0; j<renge_A_two; j++)                             // Перебираем массив A[][10] по ВТОРОМУ измерению.
              B[i][j]=A[i][j];
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: "А" скопирован в "В" без изменений 
//            renge_A_one = renge_В_one
//            renge_A_two = renge_В_two

//+------------------------------------------------------------------+
//| Вариант 2. Копируем строки "А" в "В" при условии                 |
//+------------------------------------------------------------------+
void Fun_2()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         if(A[i][3]>0)
             {
              count_B++;
              ArrayResize(B, count_B);
              for(int j=0; j<renge_A_two; j++)                        // Перебираем массив A[][10] по ВТОРОМУ измерению.
                   B[i][j]=A[i][j];
             }
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: часть строк "В" с соответствующими значениями
//            часть строк "В" заполнена "0" полностью, при том, что в "А" заполнены ЗНАЧЕНИЯМИ
//            renge_A_one > renge_В_one
//            renge_A_two = renge_В_two
 
Arseniy Barudkin:
Bonjour, Veuillez m'aider à écrire une fonction dans MT4. Je connais le solde de mon compte, je sais combien de transactions seront ouvertes (par exemple 9), je connais le risque (par exemple 3% du solde du compte), je dois calculer un lot pour la première transaction, si chaque lot suivant sera doublé et si toutes les transactions se chevaucheront.

C'est ce que j'ai obtenu. S'il vous plaît, dites-moi ce qui ne va pas. Merci d'avance !

Élémentaire. L'erreur vient de la fonctionGetLots(). Toute la fonction.
 
Leo59:

Bonjour !

J'écris ici, car il semble n'y avoir personne sur mq4.

Pouvez-vous me dire ce que je fais mal ? L'option 2 ne fonctionne pas.

double A[][10];
int renge_A_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_A_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)

double B[][10];
int renge_B_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_B_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)
int count_B=0;

//+------------------------------------------------------------------+
//| Вариант 1. Копируем строки "А" в "В" без изменений               |
//+------------------------------------------------------------------+
void Fun_1()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         count_B++;
         ArrayResize(B, count_B);
         for(int j=0; j<renge_A_two; j++)                             // Перебираем массив A[][10] по ВТОРОМУ измерению.
              B[i][j]=A[i][j];
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: "А" скопирован в "В" без изменений 
//            renge_A_one = renge_В_one
//            renge_A_two = renge_В_two

//+------------------------------------------------------------------+
//| Вариант 2. Копируем строки "А" в "В" при условии                 |
//+------------------------------------------------------------------+
void Fun_2()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         if(A[i][3]>0)
             {
              count_B++;
              ArrayResize(B, count_B);
              for(int j=0; j<renge_A_two; j++)                        // Перебираем массив A[][10] по ВТОРОМУ измерению.
                   B[i][j]=A[i][j];
             }
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: часть строк "В" с соответствующими значениями
//            часть строк "В" заполнена "0" полностью, при том, что в "А" заполнены ЗНАЧЕНИЯМИ
//            renge_A_one > renge_В_one
//            renge_A_two = renge_В_two

Surligné : il devrait y avoir une affectation - "=" et vous avez une comparaison - "==".

 

Bonjour à tous !
J'apprends à écrire des robots dans mt4, j'ai décidé de commencer avec les options binaires. Je suis en train d'écrire une simple EA, mais le compilateur génère beaucoup d'avertissements, je ne peux pas le comprendre (
Aide : "Oh MQL4 Guru" =))))))
Merci d'avance)

Voici le code de l'EA.

//+------------------------------------------------------------------+
//|Bolinger_Bands_traider.mq4 |
//|Copyright 2017, Penrov Nikolay |
//|vk.com/buzamonolit |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Petrov Nikolay"
#Propriété lien "vk.com/buzamonolit"
#propriété version "1.00"
#propriété stricte
//+------------------------------------------------------------------+
//| fonction d'initialisation de l'expert|
//+------------------------------------------------------------------+
extern int Bolinger_Bands = 20 ; // Période des bandes de Bollinger
extern double Delta = 0.0003 ; // A quelle distance ouvrir l'ordre.

string Symb ; // Nom de l'instrument financier.
int Total ; // Nombre de commandes

//+------------------------------------------------------------------+
//| fonction d'initialisation de l'expert|
//+------------------------------------------------------------------+
int init()
{
//----
Initialize_Objects(0) ;
//----
retour(0) ;
}
//+------------------------------------------------------------------+
//| fonction de désinitialisation de l'expert|
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
retour(0) ;
}
//+------------------------------------------------------------------+
//| fonction de démarrage de l'expert|
//+------------------------------------------------------------------+
int start()
{
//----
double price = Bid ;
double CurrBol_High = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_UPPER, 0) ;
double CurrBol_Low = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_LOWER, 0) ;
double PriceBol_High = prix - CurrBol_High ;
double PriceBol_Low = prix - CurrBol_Low ;
datetime NextClose = Time[0] + Period()*60*2 ;
int MinutesToNextClose = (NextClose - TimeCurrent())/60 + 1 ;
int err ;

// Comptage des commandes
Symb=Symbole() ;// Nom de l'aileron.symbole() ; // symbole() ; // symbole() ; // icône de commande() ; // symbole().
Total=0 ;// Nombre de commandes
for(int i=1 ; i<=OrdersTotal() ; i++) // Boucle de commande
{
si (OrderSelect(i-1,SELECT_BY_POS)==true) // S'il existe un suivant
{// Analyse des commandes :
if (OrderSymbol()!=Symb)continue ; // Pas notre instrument financier
si (OrderType()>1)// Nous avons un ordre en attente
{
Alert("Ordre en attente détecté. Le conseiller expert ne fonctionne pas ;)
retour(0) ;// Exit()
}
Total++ ;// Contre marché. commander
si (Total>1)// Pas plus d'une commande
{
Alert("Plusieurs ordres de marché. Le conseiller expert ne fonctionne pas.") ;
retour(0) ;// Exit()
}
}
}

ObjectSetText("Obj_Label", "TF" + Period() + ", " + DoubleToStr(price, 5) + ", tick " + TimeToStr(TimeCurrent(), TIME_SECONDS) + ", O@" + TimeToStr(Time[0], TIME_MINUTES) + ", NC@" + TimeToStr(NextClose, TIME_MINUTES) + " (" + MinutesToNextClose + " min)", 10, "Arial", DarkGreen ) ;
ObjectSetText("Obj_Label2", "Orders :" + Total + ", delta " + DoubleToStr(Delta,5) + ", distance to MA :" + DoubleToStr(PriceBol_High, 5), 10, "Arial", DarkGreen ) ;
ObjectSetText("Obj_Label3", "Ordres : " + Total + ", Delta " + DoubleToStr(Delta,5) + ", distance à la MA :" + DoubleToStr(PriceBol_Low, 5), 10, "Arial", DarkGreen ) ;


// analyse des prix et ouverture des ordres

si ((MathAbs(PriceBol_Low) < Delta) && (price > CurrBol_Low) && (Open[0] > CurrBol_Low+Delta) && (Total<1))
{
si (OrderSend(Symbol(), OP_BUY, 1.00,Bid , 3, 0, 0, "BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Green) >0) Print ("Opened OK") ;
sinon
{
err=GetLastError() ;
Print("error(",err,")) ;
retour(0) ;

}
Print ("CALL @ " + price + " + TimeToStr(TimeCurrent(), TIME_SECONDS) + " exp in " + MinutesToNextClose) ;

}

si ((MathAbs(PriceBol_High) < Delta) && (price < CurrBol_High) && (Open[0] < CurrBol_High-Delta) && (Total<1))
{
si (OrderSend(Symbol(), OP_SELL, 1.00,Bid , 3, 0, 0, "BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Red) > 0) Print ("Opened OK") ;
sinon
{
err=GetLastError() ;
Print("error(",err,")) ;
retour(0) ;

}
Print ("PUT @ " + price + " + TimeToStr(TimeCurrent(), TIME_SECONDS) + " exp in " + MinutesToNextClose) ;

}

//----
retour(0) ;
}
//+------------------------------------------------------------------+

int Initialize_Objects(int Win) // Fie utilisateur
{// .création d'objets
ObjectCreate("Obj_Label",OBJ_LABEL, Win, 0,0) ; // création d'objet
ObjectSet("Obj_Label", OBJPROP_CORNER, 0) ; // Lié à un coin
ObjectSet("Obj_Label", OBJPROP_XDISTANCE, 13) ; // Coordonnée X
si (Win==0)
ObjectSet("Obj_Label",OBJPROP_YDISTANCE, 15);//coordonnée Y
sinon
ObjectSet("Obj_Label",OBJPROP_YDISTANCE,15);//coordonnée Y

ObjectCreate("Obj_Label2",OBJ_LABEL,Win, 0,0) ; // Création d'objet
ObjectSet("Obj_Label2",OBJPROP_CORNER, 0) ; // Liaison avec un coin
ObjectSet("Obj_Label2", OBJPROP_XDISTANCE, 13) ; // Coordonnée X
si (Win==0)
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);//coordonnée Y
sinon
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);//Coordonnée Y

ObjectCreate("Obj_Label3",OBJ_LABEL, Win, 0,0) ; // Créer un objet
ObjectSet("Obj_Label3",OBJPROP_CORNER, 0) ; // Liaison avec un coin
ObjectSet("Obj_Label3", OBJPROP_XDISTANCE, 13) ; // Coordonnée X
si (Win==0)
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);//coordonnée Y
sinon
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);//Coordonnée Y

retour(0) ;// Sortir de l'utilisateur.fonction
}

 

Voici les avertissements. Je n'arrive pas à comprendre ce qu'il n'aime pas.


perte possible de données due à la conversion de type Bolinger_Bands_traider.mq4 51 24
conversion implicite de 'nombre' en 'chaîne' Bolinger_Bands_traider.mq4 76 35
conversion implicite de 'nombre' en 'chaîne' Bolinger_Bands_traider.mq4 76 227
conversion implicite de 'nombre' en 'chaîne' Bolinger_Bands_traider.mq4 77 43
conversion implicite de 'nombre' en 'chaîne' Bolinger_Bands_traider.mq4 78 43
conversion implicite de 'string' en 'number' Bolinger_Bands_traider.mq4 85 71
conversion implicite de 'nombre' en 'chaîne' Bolinger_Bands_traider.mq4 93 23
conversion implicite de 'nombre' en 'chaîne' Bolinger_Bands_traider.mq4 93 91
conversion implicite de 'string' en 'number' Bolinger_Bands_traider.mq4 99 72
conversion implicite de 'nombre' en 'chaîne' Bolinger_Bands_traider.mq4 107 23
conversion implicite de 'nombre' en 'chaîne de caractères' Bolinger_Bands_traider.mq4 107 91
0 erreur(s), 11 avertissement(s), temps de compilation : 204 msec 1 12

 
Vitalie Postolache:
Élémentaire. L'erreur vient de la fonctionGetLots(). Toute la fonction.

Vous pouvez peut-être me dire comment l'écrire correctement. Je voulais calculer en utilisant la boucle par force brute à partir du lot maximum.
 
Arseniy Barudkin:

Vous pouvez peut-être me dire comment l'écrire correctement. Je voulais calculer en utilisant une boucle en essayant à partir du lot maximum.


Où est la logique ? Vous fixez le lot maximal autorisé pour la première commande, puis vous l'augmentez pour chaque commande successive. Cela ne vous semble-t-il pas, pour ne pas dire plus, pas très raisonnable ?

En outre, vous diminuez le lot du premier ordre dans la boucle en utilisant une méthode totalement incompréhensible, tandis que les lots des autres ordres, qui ont été "calculés" auparavant, restent inchangés, et ces valeurs ne dépassent en aucun cas les limites de cette fonction. Alors, que font-ils ?

Sans compter que la boucle d'incrémentation ne peut pas être un nombre réel, elle doit être un compteur, un entier. Mais vous définissez la valeur du lot comme un compteur et vous en soustrayez un à chaque itération. C'est une erreur majeure, une erreur très grave.

Clarifiez d'abord la logique dans votre esprit, puis essayez de la mettre en œuvre dans votre code.

 
bog_v_nas:

Mais voici les avertissements. Je ne comprends pas ce qu'il n'aime pas.


perte possible de données due à la conversion de type Bolinger_Bands_traider.mq4 51 24
conversion implicite de 'nombre' en 'chaîne' Bolinger_Bands_traider.mq4 76 35
conversion implicite de 'nombre' en 'chaîne' Bolinger_Bands_traider.mq4 76 227
conversion implicite de 'nombre' en 'chaîne' Bolinger_Bands_traider.mq4 77 43
conversion implicite de 'nombre' en 'chaîne' Bolinger_Bands_traider.mq4 78 43
conversion implicite de 'string' en 'number' Bolinger_Bands_traider.mq4 85 71
conversion implicite de 'nombre' en 'chaîne' Bolinger_Bands_traider.mq4 93 23
conversion implicite de 'nombre' en 'chaîne' Bolinger_Bands_traider.mq4 93 91
conversion implicite de 'string' en 'number' Bolinger_Bands_traider.mq4 99 72
conversion implicite de 'nombre' en 'chaîne' Bolinger_Bands_traider.mq4 107 23
conversion implicite de 'nombre' en 'chaîne de caractères' Bolinger_Bands_traider.mq4 107 91
0 erreur(s), 11 avertissement(s), temps de compilation : 204 msec 1 12

Sortir une ligne avec le numéro 51, car il n'y a pas de compte ici pour comprendre l'erreur"possible loss of data due to type conversion Bolinger_Bands_traider.mq4 51 24".

Le reste : "conversion implicite de 'nombre' en 'chaîne de caractères' Bolinger_Bands_traider.mq4 107 91

traduire les valeurs numériques en une chaîne de texte où nous créons l'objet - une chaîne de texte, par exemple

période()

il devrait l'être

DoubleToString(Période(),0)

 
Renat Akhtyamov:

traduire les valeurs numériques en une chaîne de texte où nous créons un objet chaîne de texte, par exemple

période()

il devrait l'être

DoubleToString(Période(),0)


Depuis quand la période est un type double?
Raison: