Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 70

 
Hallo, könnten Sie mir bitte helfen, eine Funktion in MT4 zu schreiben. Ich kenne meinen Kontostand, ich weiß, wie viele Trades ich eröffnen werde (z.B. 9), ich kenne das Risiko (z.B. 3% des Kontostandes), ich muss ein Lot für den ersten Trade berechnen, wenn jedes weitere Lot verdoppelt wird und sich alle Trades überschneiden werden.
//Функция расчета торгового лота
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);
}

Das habe ich bekommen. Bitte sagen Sie mir, was los ist. Vielen Dank im Voraus!

 

Hallo!

Ich schreibe hier, weil es niemanden auf mq4 zu geben scheint.

Können Sie mir sagen, was ich falsch mache? Option 2 funktioniert nicht.

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:
Hallo, könnten Sie mir bitte helfen, eine Funktion in MT4 zu schreiben. Ich kenne meinen Kontostand, ich weiß, wie viele Trades ich eröffnen werde (z.B. 9), ich kenne das Risiko (z.B. 3% des Kontostandes), ich muss ein Lot für den ersten Trade berechnen, wenn jedes weitere Lot verdoppelt wird und sich alle Trades überschneiden werden.

Das habe ich bekommen. Bitte sagen Sie mir, was los ist. Vielen Dank im Voraus!

Elementarbereich. Der Fehler liegt bei der FunktionGetLots(). Die gesamte Funktion.
 
Leo59:

Hallo!

Ich schreibe hier, weil es scheint, dass niemand auf mq4 ist.

Können Sie mir sagen, was ich falsch mache? Option 2 funktioniert nicht.

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

Hervorgehoben: Es sollte eine Zuweisung - "=" - geben und Sie haben einen Vergleich - "==".

 

Hallo zusammen!
Ich bin lernen, Roboter in mt4 zu schreiben, entschied ich mich mit binären Optionen zu starten. Ich schreibe einen einfachen EA, aber der Compiler generiert eine Menge Warnungen, die ich nicht verstehen kann (
Hilfe: "Oh MQL4 Guru" =))))))
Vielen Dank im Voraus!)

Hier ist der Code für den EA.

//+------------------------------------------------------------------+
//|Bolinger_Bands_traider.mq4 |
//|Copyright 2017, Penrov Nikolay |
//|vk.com/buzamonolit |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Petrov Nikolay"
#property link "vk.com/buzamonolit"
#Eigenschaft Version "1.00"
#Eigenschaft streng
//+------------------------------------------------------------------+
//| Experten-Initialisierungsfunktion|
//+------------------------------------------------------------------+
extern int Bolinger_Bands = 20; // Bollinger Band Zeitraum
extern double Delta = 0.0003; // In welchem Abstand soll der Auftrag eröffnet werden?

string Symb; // Name des Finanzinstruments.
int Total; // Anzahl der Bestellungen

//+------------------------------------------------------------------+
//| Experten-Initialisierungsfunktion|
//+------------------------------------------------------------------+
int init()
{
//----
Initialize_Objects(0);
//----
zurück(0);
}
//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion|
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
zurück(0);
}
//+------------------------------------------------------------------+
//| Expertenstartfunktion|
//+------------------------------------------------------------------+
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 = Preis - CurrBol_High;
double PriceBol_Low = Preis - CurrBol_Low;
datetime NextClose = Time[0] + Period()*60*2;
int MinutesToNextClose = (NextClose - TimeCurrent())/60 + 1;
int err;

// Zählen der Aufträge
Symbol=Symbol();// Name der Flosse.symbol(); // symbol(); // symbol(); // order icon(); // symbol().
Gesamt=0;// Anzahl der Aufträge
for(int i=1; i<=OrdersTotal(); i++) // Auftragsschleife
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Wenn es einen nächsten
{// Auftragsanalyse:
if (OrderSymbol()!=Symb)continue; // Nicht unser Finanzinstrument
wenn (Auftragsart()>1)// Wir haben einen schwebenden Auftrag
{
Alert("Pending order detected. Expert Advisor is not working;)
zurück(0);// Beenden()
}
Total++;// Gegenmarkt. Bestellung
wenn (Gesamt>1)// Nicht mehr als ein Auftrag
{
Alert("Mehrere Marktaufträge, Expert Advisor funktioniert nicht");
zurück(0);// Beenden()
}
}
}

ObjectSetText("Obj_Label", "TF" + Zeitraum() + ", " + 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", "Aufträge: " + Gesamt + ", Delta " + DoubleToStr(Delta,5) + ", Abstand zum MA:" + DoubleToStr(PriceBol_Low, 5), 10, "Arial", DarkGreen );


// Preisanalyse und Auftragseröffnung

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

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

}

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

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

}

//----
zurück(0);
}
//+------------------------------------------------------------------+

int Initialize_Objects(int Win) // Benutzer fie
{// .Objekterstellung
ObjectCreate("Obj_Label",OBJ_LABEL, Win, 0,0); // Objekterstellung
ObjectSet("Obj_Label", OBJPROP_CORNER, 0); // Bindung an eine Ecke
ObjectSet("Obj_Label", OBJPROP_XDISTANCE, 13); // X-Koordinate
wenn (Win==0)
ObjectSet("Obj_Label",OBJPROP_YDISTANCE, 15);//Y-Koordinate
sonst
ObjectSet("Obj_Label",OBJPROP_YDISTANCE,15);//Y-Koordinate

ObjectCreate("Obj_Label2",OBJ_LABEL,Win, 0,0); // Erstellung von Objekten
ObjectSet("Obj_Label2",OBJPROP_CORNER, 0); // Bindung an eine Ecke
ObjectSet("Obj_Label2", OBJPROP_XDISTANCE, 13); // X-Koordinate
wenn (Win==0)
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);//Y-Koordinate
sonst
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);//Y-Koordinate

ObjectCreate("Obj_Label3",OBJ_LABEL, Win, 0,0); // Objekt erstellen
ObjectSet("Obj_Label3",OBJPROP_CORNER, 0); // Bindung an eine Ecke
ObjectSet("Obj_Label3", OBJPROP_XDISTANCE, 13); // X-Koordinate
wenn (Win==0)
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);//Y-Koordinate
sonst
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);//Y-Koordinate

zurück(0);// Beenden von Benutzer.Funktion
}

 

Hier sind die Warnhinweise. Ich kann nicht herausfinden, was er nicht mag(


möglicher Datenverlust aufgrund von Typkonvertierung Bolinger_Bands_traider.mq4 51 24
implizite Umwandlung von 'Zahl' in 'String' Bolinger_Bands_traider.mq4 76 35
implizite Umwandlung von 'Zahl' in 'String' Bolinger_Bands_traider.mq4 76 227
implizite Umwandlung von 'Zahl' in 'String' Bolinger_Bands_traider.mq4 77 43
implizite Umwandlung von 'Zahl' in 'String' Bolinger_Bands_traider.mq4 78 43
implizite Umwandlung von 'String' in 'Zahl' Bolinger_Bands_traider.mq4 85 71
implizite Umwandlung von 'Zahl' in 'String' Bolinger_Bands_traider.mq4 93 23
implizite Umwandlung von 'Zahl' in 'String' Bolinger_Bands_traider.mq4 93 91
implizite Umwandlung von 'String' in 'Zahl' Bolinger_Bands_traider.mq4 99 72
implizite Umwandlung von 'Zahl' in 'String' Bolinger_Bands_traider.mq4 107 23
implizite Umwandlung von 'Zahl' in 'String' Bolinger_Bands_traider.mq4 107 91
0 Fehler, 11 Warnung(en), Kompilierzeit: 204 msec 1 12

 
Vitalie Postolache:
Elementarbereich. Der Fehler liegt bei der FunktionGetLots(). Die gesamte Funktion.

Vielleicht können Sie mir sagen, wie man es richtig schreibt. Ich wollte mit Schleife durch Brute-Forcing von max Los zu berechnen.
 
Arseniy Barudkin:

Vielleicht können Sie mir sagen, wie man es richtig schreibt. Ich wollte mit Hilfe einer Schleife berechnen, indem ich vom maximalen Los ausgehe.


Wo ist die Logik? Sie legen die maximal zulässige Menge für den ersten Auftrag fest und erhöhen sie dann für jeden weiteren Auftrag. Erscheint Ihnen das nicht, gelinde gesagt, nicht sehr vernünftig?

Außerdem verringern Sie die Menge des ersten Auftrags in der Schleife mit einer völlig unverständlichen Methode, während die Mengen der anderen Aufträge, die zuvor "berechnet" wurden, unverändert bleiben, und diese Werte überschreiten in keiner Weise die Grenzen dieser Funktion. Was tun sie dann?

Ganz zu schweigen davon, dass die Inkrementschleife keine reelle Zahl sein kann, sondern ein Zähler, eine ganze Zahl, sein muss. Aber Sie setzen den Wert des Loses als Zähler und subtrahieren bei jeder Iteration einen Wert davon. Dies ist ein großer Fehler, ein sehr schwerer Fehler.

Klären Sie die Logik zunächst in Ihrem Kopf und versuchen Sie dann, sie in Ihren Code zu implementieren.

 
bog_v_nas:

Aber hier sind die Warnungen. Ich kann nicht verstehen, was er nicht mag(


möglicher Datenverlust aufgrund von Typkonvertierung Bolinger_Bands_traider.mq4 51 24
implizite Umwandlung von 'Zahl' in 'String' Bolinger_Bands_traider.mq4 76 35
implizite Umwandlung von 'Zahl' in 'String' Bolinger_Bands_traider.mq4 76 227
implizite Umwandlung von 'Zahl' in 'String' Bolinger_Bands_traider.mq4 77 43
implizite Umwandlung von 'Zahl' in 'String' Bolinger_Bands_traider.mq4 78 43
implizite Umwandlung von 'String' in 'Zahl' Bolinger_Bands_traider.mq4 85 71
implizite Umwandlung von 'Zahl' in 'String' Bolinger_Bands_traider.mq4 93 23
implizite Umwandlung von 'Zahl' in 'String' Bolinger_Bands_traider.mq4 93 91
implizite Umwandlung von 'String' in 'Zahl' Bolinger_Bands_traider.mq4 99 72
implizite Umwandlung von 'Zahl' in 'String' Bolinger_Bands_traider.mq4 107 23
implizite Umwandlung von 'Zahl' in 'String' Bolinger_Bands_traider.mq4 107 91
0 Fehler, 11 Warnung(en), Kompilierzeit: 204 msec 1 12

Eine Zeile mit der Nummer 51 ausgeben, da es hier keine Zählung gibt, um den Fehler"possible loss of data due to type conversion Bolinger_Bands_traider.mq4 51 24" zu verstehen

Der Rest: "implizite Umwandlung von 'Zahl' in 'String' Bolinger_Bands_traider.mq4 107 91

numerische Werte in eine Textzeichenfolge übersetzen, wo wir das Objekt erstellen - eine Textzeichenfolge, zum Beispiel

Zeitraum()

sollte es sein

DoubleToString(Zeitraum(),0)

 
Renat Akhtyamov:

die numerischen Werte in eine Textzeichenfolge übersetzen, wobei wir ein Textzeichenfolgenobjekt erstellen, z. B.

Zeitraum()

sollte es sein

DoubleToString(Zeitraum(),0)


Seit wann ist die Periode ein Double-Typ?