Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 70

 
Ciao, Potresti per favore aiutarmi a scrivere una funzione in MT4. Conosco il saldo del mio conto, so quante operazioni si apriranno (per esempio 9), conosco il rischio (per esempio 3% di AccountBalance), ho bisogno di calcolare un lotto per la prima operazione, se ogni lotto successivo sarà raddoppiato e tutte le operazioni si sovrapporranno.
//Функция расчета торгового лота
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);
}

Questo è quello che ho ottenuto. Per favore, ditemi cosa c'è che non va. Grazie in anticipo!

 

Ciao!

Scrivo qui perché sembra che non ci sia nessuno su mq4.

Puoi dirmi cosa sto sbagliando? L'opzione 2 non funziona.

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:
Salve, per favore aiutatemi a scrivere una funzione in MT4. Conosco il saldo del mio conto, so quante operazioni si apriranno (per esempio 9), conosco il rischio (per esempio 3% di AccountBalance), ho bisogno di calcolare un lotto per la prima operazione, se ogni lotto successivo sarà raddoppiato e tutte le operazioni si sovrapporranno.

Questo è quello che ho ottenuto. Per favore, ditemi cosa c'è che non va. Grazie in anticipo!

Elementare. L'errore è la funzioneGetLots(). L'intera funzione.
 
Leo59:

Ciao!

Scrivo qui, perché sembra che non ci sia nessuno su mq4.

Puoi dirmi cosa sto sbagliando? L'opzione 2 non funziona.

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

Evidenziato: ci dovrebbe essere un'assegnazione - "=" e hai un confronto - "==".

 

Ciao a tutti!
Sto imparando a scrivere robot in mt4, ho deciso di iniziare con le opzioni binarie. Sto scrivendo un semplice EA, ma il compilatore genera un sacco di avvertimenti, non riesco a capirlo (
Aiuto: "Oh MQL4 Guru" =))))))
Grazie in anticipo).

Ecco il codice per l'EA.

//+------------------------------------------------------------------+
//|Bolinger_Bands_traider.mq4 |
//|Copyright 2017, Penrov Nikolay |
//|vk.com/buzamonolit |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Petrov Nikolay"
#proprietà link "vk.com/buzamonolit"
#proprietà versione "1.00"
#proprietà rigorosa
//+------------------------------------------------------------------+
//| funzione di inizializzazione dell'esperto|
//+------------------------------------------------------------------+
extern int Bolinger_Bands = 20; // periodo di Bollinger Band
extern double Delta = 0.0003; // A quale distanza aprire l'ordine

string Symb; // Nome dello strumento finanziario.
int Total; // numero di ordini

//+------------------------------------------------------------------+
//| funzione di inizializzazione dell'esperto|
//+------------------------------------------------------------------+
int init()
{
//----
Initialize_Objects(0);
//----
ritorno(0);
}
//+------------------------------------------------------------------+
//| funzione di deinizializzazione esperta|
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
ritorno(0);
}
//+------------------------------------------------------------------+
//| funzione di inizio esperto|
//+------------------------------------------------------------------+
int start()
{
//----
doppio prezzo = Bid;
doppio CurrBol_High = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_UPPER, 0);
doppio CurrBol_Low = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_LOWER, 0);
doppio PriceBol_High = prezzo - CurrBol_High;
doppio PriceBol_Low = prezzo - CurrBol_Low;
datetime NextClose = Time[0] + Period()*60*2;
int MinutesToNextClose = (NextClose - TimeCurrent())/60 + 1;
int err;

// Conteggio degli ordini
Symb=Symbol();// Nome della pinna.simbolo(); // simbolo(); // simbolo(); // icona d'ordine(); // simbolo().
Totale=0;// Numero di ordini
for(int i=1; i<=OrdersTotal(); i++) // ciclo degli ordini
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Se c'è un prossimo
{// Analisi degli ordini:
if (OrderSymbol()!=Symb)continue; // Non è il nostro strumento finanziario
se (OrderType()>1)// Abbiamo un ordine in sospeso
{
Alert("Ordine in sospeso rilevato. Expert Advisor non funziona;)
ritorno(0);// Exit()
}
Totale++;// Contro mercato. ordine
se (Totale>1)// Non più di un ordine
{
Alert("Diversi ordini a mercato. Expert Advisor non funziona");
ritorno(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", "Ordini:" + Totale + ", delta " + DoubleToStr(Delta,5) + ", distanza da MA:" + DoubleToStr(PriceBol_High, 5), 10, "Arial", DarkGreen );
ObjectSetText("Obj_Label3", "Ordini: " + Totale + ", Delta " + DoubleToStr(Delta,5) + ", distanza da MA:" + DoubleToStr(PriceBol_Low, 5), 10, "Arial", DarkGreen );


// analisi dei prezzi e apertura degli ordini

se ((MathAbs(PriceBol_Low) < Delta) && (prezzo > CurrBol_Low) && (Open[0] > CurrBol_Low+Delta) && (Totale<1))
{
if (OrderSend(Symbol(), OP_BUY, 1.00,Bid , 3, 0, 0, "BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Green) >0) Print ("Opened OK");
else
{
err=GetLastError();
Stampa("errore(",err,"));
ritorno(0);

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

}

se ((MathAbs(PriceBol_High) < Delta) && (prezzo < CurrBol_High) && (Open[0] < CurrBol_High-Delta) && (Totale<1))
{
if (OrderSend(Symbol(), OP_SELL, 1.00,Bid , 3, 0, 0, "BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Red) > 0) Print ("Opened OK");
else
{
err=GetLastError();
Stampa("errore(",err,"));
ritorno(0);

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

}

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

int Initialize_Objects(int Win) // Fie dell'utente
{// .creazione di oggetti
ObjectCreate("Obj_Label",OBJ_LABEL, Win, 0,0); // creazione dell'oggetto
ObjectSet("Obj_Label", OBJPROP_CORNER, 0); // Legare a un angolo
ObjectSet("Obj_Label", OBJPROP_XDISTANCE, 13); // coordinata X
se (Win==0)
ObjectSet("Obj_Label",OBJPROP_YDISTANCE, 15);//Coordinata Y
else
ObjectSet("Obj_Label",OBJPROP_YDISTANCE,15);//Coordinata Y

ObjectCreate("Obj_Label2",OBJ_LABEL,Win, 0,0); // creazione dell'oggetto
ObjectSet("Obj_Label2",OBJPROP_CORNER, 0); // Binding a un angolo
ObjectSet("Obj_Label2", OBJPROP_XDISTANCE, 13); // coordinata X
se (Win==0)
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);//Coordinata Y
else
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);//Coordinata Y

ObjectCreate("Obj_Label3",OBJ_LABEL, Win, 0,0); // Crea oggetto
ObjectSet("Obj_Label3",OBJPROP_CORNER, 0); // Legame con un angolo
ObjectSet("Obj_Label3", OBJPROP_XDISTANCE, 13); // coordinata X
se (Win==0)
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);//Coordinata Y
else
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);//Coordinata Y

ritorno(0);// Uscire dall'utente.funzione
}

 

Ecco gli avvertimenti. Non riesco a capire che cosa non gli piaccia (vedi "La mia famiglia").


possibile perdita di dati a causa della conversione del tipo Bolinger_Bands_traider.mq4 51 24
conversione implicita da 'numero' a 'stringa' Bolinger_Bands_traider.mq4 76 35
conversione implicita da 'numero' a 'stringa' Bolinger_Bands_traider.mq4 76 227
conversione implicita da 'numero' a 'stringa' Bolinger_Bands_traider.mq4 77 43
conversione implicita da 'numero' a 'stringa' Bolinger_Bands_traider.mq4 78 43
conversione implicita da 'string' a 'number' Bolinger_Bands_traider.mq4 85 71
conversione implicita da 'numero' a 'stringa' Bolinger_Bands_traider.mq4 93 23
conversione implicita da 'numero' a 'stringa' Bolinger_Bands_traider.mq4 93 91
conversione implicita da 'string' a 'number' Bolinger_Bands_traider.mq4 99 72
conversione implicita da 'numero' a 'stringa' Bolinger_Bands_traider.mq4 107 23
conversione implicita da 'numero' a 'stringa' Bolinger_Bands_traider.mq4 107 91
0 errore(i), 11 avviso(i), tempo di compilazione: 204 msec 1 12

 
Vitalie Postolache:
Elementare. L'errore è la funzioneGetLots(). L'intera funzione.

Forse puoi dirmi come scriverlo correttamente. Volevo calcolare usando il loop forzando brute da max lot.
 
Arseniy Barudkin:

Forse puoi dirmi come scriverlo correttamente. Volevo calcolare utilizzando un ciclo provando dal lotto massimo.


Dov'è la logica? Si imposta il lotto massimo consentito per il primo ordine e poi lo si aumenta per ogni ordine successivo. Non vi sembra, per usare un eufemismo, poco sensato?

Inoltre, si diminuisce il lotto del primo ordine nel ciclo usando qualche metodo totalmente incomprensibile, mentre i lotti degli altri ordini, che sono stati "calcolati" prima, rimangono invariati, e questi valori non vanno oltre i limiti di questa funzione in nessun modo. Cosa fanno allora?

Senza contare che il ciclo di incremento non può essere un numero reale, deve essere un contatore, un intero. Ma voi impostate il valore del lotto come contatore e sottraete uno da esso ad ogni iterazione. Questo è un grande errore, un errore molto grave.

Chiarite prima la logica nella vostra mente e poi cercate di implementarla nel vostro codice.

 
bog_v_nas:

Ma ecco gli avvertimenti. Non riesco a capire che cosa non gli piace (vedi sopra).


possibile perdita di dati a causa della conversione del tipo Bolinger_Bands_traider.mq4 51 24
conversione implicita da 'numero' a 'stringa' Bolinger_Bands_traider.mq4 76 35
conversione implicita da 'numero' a 'stringa' Bolinger_Bands_traider.mq4 76 227
conversione implicita da 'numero' a 'stringa' Bolinger_Bands_traider.mq4 77 43
conversione implicita da 'numero' a 'stringa' Bolinger_Bands_traider.mq4 78 43
conversione implicita da 'string' a 'number' Bolinger_Bands_traider.mq4 85 71
conversione implicita da 'numero' a 'stringa' Bolinger_Bands_traider.mq4 93 23
conversione implicita da 'numero' a 'stringa' Bolinger_Bands_traider.mq4 93 91
conversione implicita da 'string' a 'number' Bolinger_Bands_traider.mq4 99 72
conversione implicita da 'numero' a 'stringa' Bolinger_Bands_traider.mq4 107 23
conversione implicita da 'numero' a 'stringa' Bolinger_Bands_traider.mq4 107 91
0 errore(i), 11 avviso(i), tempo di compilazione: 204 msec 1 12

Emettere una riga con il numero 51, poiché non c'è un conteggio qui per capire l'errore"possibile perdita di dati a causa della conversione del tipo Bolinger_Bands_traider.mq4 51 24"

Il resto: "conversione implicita da 'numero' a 'stringa' Bolinger_Bands_traider.mq4 107 91

tradurre i valori numerici in una stringa di testo dove creiamo l'oggetto - una stringa di testo, per esempio

periodo()

dovrebbe essere

DoubleToString(Periodo(),0)

 
Renat Akhtyamov:

tradurre i valori numerici in una stringa di testo dove creiamo un oggetto stringa di testo, per esempio

periodo()

dovrebbe essere

DoubleToString(Periodo(),0)


Da quando il periodo è un tipo Double?
Motivazione: