[ARCHIV!] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen - 4. - Seite 220

 
paladin80:
Meiner Erfahrung nach ist die effektivste Art, Fehler zu finden, die Anzeige einer Meldung in den Kommentaren mit der Fehlernummer, gefolgt von einem visuellen Lauf des EA. Am Anfang braucht man viel Zeit, aber dann lernt man schnell, wie man es fehlerfrei machen kann. Sie können auch Teile des Codes mit /* ... ausschließen. */, können Sie bestimmen, wie sich das Verhalten des EA ändert.
Ich tue dasselbe))
 
alsu:
Sie haben es richtig verstanden. Wenn wir einen Wert aus der Box nehmen, ist er vom Typ double, aber wenn der Befehl gegeben wird, das Ergebnis in eine Variable vom Typ int zu schreiben, wird der Compiler automatisch alle notwendigen Schritte unternehmen, um den Wert in eine neue Box zu schreiben.


Um endlich sicher zu sein, dass ich es richtig verstanden habe, überprüfen Sie bitte meine Gedanken zu Ihrem letzten Absatz... Nehmen wir also den oben genannten Experten:

//--------------------------------------------------------------------
// globalvar.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int    Experts;                                 // Колич. экспертов
double Depo=10000.0,                            // Заданный депозит
       Persent=30,                              // Заданный процент     
       Money;                                   // Искомые средства
string Quantity="GV_Quantity";                  // Имя GV-переменной
//--------------------------------------------------------------------
int init()                                      // Спец. функция init
  {
   Experts=GlobalVariableGet(Quantity);         // Получим тек. знач.
   Experts=Experts+1;                           // Колич. экспертов
   GlobalVariableSet(Quantity, Experts);        // Новое значение
   Money=Depo*Persent/100/Experts;              // Средства для эксп.
   Alert("Для эксперта в окне ", Symbol()," выделено ",Money);
   return;                                      // Выход из init()
  }
//--------------------------------------------------------------------
int start()                                     // Спец. функция start
  {
   int New_Experts= GlobalVariableGet(Quantity);// Новое колич. эксп.
   if (Experts!=New_Experts)                    // Если изменилось
     {
      Experts=New_Experts;                      // Теперь текущ. такое
      Money=Depo*Persent/100/Experts;           // Новое знач. средств 
      Alert("Новое значение для эксперта ",Symbol(),": ",Money);
     }
   /*
   ...
   Здесь долен быть указан основной код эксперта,
   в котором используется значение переменной Money
   ...
   */
   return;                                      // Выход из start()
  }
//--------------------------------------------------------------------
int deinit()                                    // Спец. ф-ия deinit
  {
   if (Experts ==1)                             // Если эксперт один..
      GlobalVariableDel(Quantity);              //..удаляем GV-перемен
   else                                         // А иначе..
      GlobalVariableSet(Quantity, Experts-1);   //..уменьшаем на 1
   Alert("Эксперт выгружен из окна ",Symbol()); // Сообщ. о выгрузке
   return;                                      // Выход из deinit()
  }
//--------------------------------------------------------------------

Dann in der Zeichenfolge:

Experts=GlobalVariableGet(Quantity);         // Получим тек. знач.

In das Feld "GV-Variable" legen wir eine Variable vom Ganzzahltyp Experten zur Speicherung (Umwandlung in den Typ double). Dann, wenn (hypothetische Annahme) es eine Zeichenfolge in der Expert Advisor sein würde

int New_Experts=Experts;

würde dies bedeuten, dass es einen Befehl gibt, das Ergebnis in eine Variable vom Typ int zu schreiben. In diesem Fall der Compiler:

* würde den Wert der Variablen vom Typ double aus der Box nehmen,

* Nehmen Sie alle erforderlichen Änderungen am Wert der Variablen Experten vor,

* diesen Wert der Variablen New_Experts zuweisen und...

* den Wert der Variablen New_Experts in ein Feld "int" eintragen.

Der Variablentyp ist also nichts anderes als eine externe Umhüllung/Verpackung eines Wertes? und daher können GV-Variablen nicht vom Typ String sein, da eine Herabstufung nur für numerische Werte zulässig ist und Strings nicht in Zahlen umgewandelt werden.

Oder?

Ich danke Ihnen im Voraus für Ihre Antwort.

 
Stells:
was nicht so for (f=1;f<Bars;f++)
{
Price1 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,f)) / MarketInfo(Symbol_1, MODE_POINT)
Preis2 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,f)) / MarketInfo(Symbol_2, MODE_POINT);
Spread = Preis1 - Preis2;
Print ("Preis1="+Preis1, " Preis2="+Preis2);
if (Spread==0){t=f; break;}
}
Price12 = (iClose(Symbol_1,0,0) - iClose(Symbol_1,0,t)) / MarketInfo(Symbol_1, MODE_POINT);
Price22 = K*(iClose(Symbol_2,0,0) - iClose(Symbol_2,0,t)) / MarketInfo(Symbol_2, MODE_POINT);
Spread2 = Price12 - Price22;


if (MathAbs(Spread2) >= razdvizka && Spread2 < 0) { Handel eröffnen }


den Balken, bei dem die Spanne gleich Null war, fixieren und die Spanne von dort aus kontrollieren wollen

if(MathAbs(Spread)<eps) { ........ } und Sie müssen noch das Ergebnis kontrollieren - ob der Punkt, der die Bedingung erfüllt, gefunden wird oder nicht. IMHO ist es besser, eine separate Funktion zu erstellen, z.B. wie diese

int GetBarNumWithZerroDist(string Smbl1, string Smbl2, double K, double eps=0.00001)
{
int i=1;
double Smb1Cl0 = NrmalizeDouble(iClose(Smbl1,0,0));
double Smb2Cl0 = NrmalizeDouble(iClose(Smbl2,0,0));
double Smb1Pnt = MarketInfo(Smbl1, MODE_POINT);
double Smb2Pnt = MarketInfo(Smbl2, MODE_POINT);
int    mBars   = MathMin(iBars(Smbl1), iBars(Smbl2));

    for (i=1;i<mBars;i++) 
    {
        double Price1 =   (Smb1Cl0 - iClose(Symbol_1,0,i)) / Smb1Pnt;
        double Price2 = K*(Smb1Cl0 - iClose(Symbol_2,0,i)) / Smb2Pnt;
        double Spread = Price1 - Price2; 
        //Print ("Price1="+Price1, " Price2="+Price2);
        if(MathAbs(Spread)< eps) return(i);
    }
    return(-1);
}
 

hallo.

Wissen Sie, ob es eine #Eigenschaft in Indikatoren gibt, die es ermöglicht, dass der Indikator immer denselben Zeitraum anzeigt, z. B. d1?

und es ändert sich nicht, auch wenn Sie den Zeitrahmen im MetaTrader wechseln?

danke

------------------------------------------

Oh... wie viele pros.....

 

Hilfe!!!!

wie man den Indikator aus dem Skript heraus aufruft, ich muss ihn wirklich in einem Fenster anzeigen lassen

 

Guten Abend, bitte helfen Sie mir, Änderungen am EA-Code vorzunehmen:
1. Beim Testen ist alles in Ordnung - aber beim Handel muss der erste Trade manuell eröffnet werden, Stop und Take ebenfalls. Ich möchte, dass der EA automatisch mit dem Handel beginnt, wenn der Preis bei einem neuen Tick ankommt.
2. Da im Falle eines ausgelösten Stop-Loss die nächste Position mit dem Doppelten des vorherigen Lots eröffnet wird, kann das Lot theoretisch bis ins Unendliche steigen (in meinem Fall bis zu 51,2), ich würde es gerne begrenzen (z.B. 0,8) mit der Möglichkeit, den Schwellenwert zu ändern. Wenn der Schwellenwert erreicht ist und ein Stopp ausgelöst wird, würde der EA nicht abbrechen, sondern bei 0,1 neu beginnen.

//--- input parameters
extern double    Lot=0.1;
extern int       TP=22;
extern int       SL=20;
extern double    K_Martin=2;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
 {
double oop, ocp, osl, otp, ol; 
int Magic = 0;
int closetime= 0,lastorder=0, tip=0;
for(int i=0;i<OrdersHistoryTotal();i++) /* Цикл перебора ордер*/
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue; // Выбираем ордер из истории.
if(OrderMagicNumber()!=Magic) continue;
if(closetime<OrderCloseTime())
{
closetime = OrderCloseTime();
lastorder = OrderTicket();
tip=OrderType();
ol=OrderLots();
}
}
OrderSelect(lastorder,SELECT_BY_TICKET,MODE_HISTORY);
ocp= (OrderClosePrice());
oop= (OrderOpenPrice());
osl= (OrderStopLoss());
otp= (OrderTakeProfit());
ol= (OrderLots());
Print ("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена открытия ОРДЕРА--[",OrderOpenPrice(),"]"); 
Print ("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена закрытия ОРДЕРА--[",OrderClosePrice(),"]");
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==false )
{
if(tip == OP_SELL && osl==ocp) //Ордер SELL закрылся по по SL значит покупаем
{
OrderSend(Symbol(),OP_BUY,ol*K_Martin,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Blue); /*Если выполняется условие то покупаем*/
}
if(tip == OP_SELL && otp==ocp) //Ордер SELL закрылся по по TP значит продаем
{
OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point, Bid-TP*Point,0,0,0,Red); /*Если выполняется условие то продаем*/ 
} 
if(tip == OP_BUY && osl==ocp) //Ордер BUY закрылся по SL значит продаем
{
OrderSend(Symbol(),OP_SELL,ol*K_Martin,Bid,0,Bid+SL*Point,Bid-TP*Point,0,0,0,Red); /*Если выполняется условие то продаем*/ 
}
if(tip == OP_BUY && otp==ocp) //Ордер BUY закрылся по по TP значит покупаем
{
OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Blue); /*Если выполняется условие то покупаем*/
} 
}
return(0);
}

 
Top2n:

Hilfe, bitte. Ich habe mich den ganzen Tag ohne jede Hilfe abgemüht.

Der Auftrag ist auf dem Pickup (Main BAY, in Erwartung des Verkaufsstopps als Sicherheitsnetz).

Bei der Schließung sellsstop in der no-loss, wieder an der gleichen Stelle verschoben.

Drehen Sie das Ding,https://www.mql5.com/ru/code/8846.
 
7777877:


Um endlich sicher zu sein, dass ich es richtig verstanden habe, überprüfen Sie bitte meine Gedanken zu Ihrem letzten Absatz... Nehmen wir also den oben genannten Experten:

Dann in der Zeichenfolge:

In das Feld "GV-Variable" legen wir eine Variable vom Ganzzahltyp Experten zur Speicherung (Umwandlung in den Typ double). Dann, wenn (hypothetische Annahme) es eine Zeichenfolge in der Expert Advisor sein würde

würde dies bedeuten, dass es einen Befehl gibt, das Ergebnis in eine Variable vom Typ int zu schreiben. In diesem Fall der Compiler:

* würde den Wert der Variablen vom Typ double aus der Box nehmen,

* Nehmen Sie alle erforderlichen Änderungen am Wert der Variablen Experten vor,

* diesen Wert der Variablen New_Experts zuweisen und...

* den Wert der Variablen New_Experts in ein Feld "int" eintragen.

Der Variablentyp ist also nichts anderes als eine externe Umhüllung/Verpackung eines Wertes? und daher können GV-Variablen nicht vom Typ String sein, da eine Herabstufung nur für numerische Werte zulässig ist und Strings nicht in Zahlen umgewandelt werden.

Oder?

Vielen Dank im Voraus für die Antwort.

Nicht ganz. Der Punkt ist, dass die Variable Experts bereits den Typ int hat, daher muss die Typkonvertierung stattfinden, BEVOR ihr ein Wert zugewiesen wird, d.h. der Compiler

* einen Wert des Typs double (der in Ihrem Programm keinen Namen hat und einfach an eine dem Compiler bekannte Adresse im Hauptspeicher oder in einem CPU-Register geschrieben wird) aus der Box nehmen

* alle notwendigen Änderungen am Wert der obigen Variablen vorgenommen und einen neuen Wert (vom Typ int!) in die Variable Experts geschrieben,

* diesen Wert (vom Typ int!) der Variablen New_Experts zugewiesen. Sie haben den gleichen Typ, so dass es nur darum geht, einen Wert von einem Speicherplatz in einen anderen zu kopieren.


P.S. Es ist schön zu sehen, dass es Menschen gibt, die ihre Taten so detailliert nachvollziehen können. In der Tat, kein Scherz. Bleiben Sie in Kontakt.

 
Andrew1001:

Guten Abend, bitte helfen Sie mir, Änderungen am EA-Code vorzunehmen:
1. Beim Testen ist alles in Ordnung - aber beim Handel muss der erste Trade manuell eröffnet werden, Stop und Take ebenfalls. Ich möchte, dass der EA automatisch mit dem Handel beginnt, wenn der Preis einen neuen Tick erreicht.
Da im Falle eines ausgelösten Stop-Loss die nächste Position mit dem Doppelten des vorherigen Lots eröffnet wird, kann das Lot theoretisch bis ins Unendliche steigen (in meinem Fall bis zu 51,2), ich würde es gerne begrenzen (z.B. 0,8) mit der Möglichkeit, den Schwellenwert zu ändern. Wenn der Schwellenwert erreicht und ein Stopp ausgelöst wird, würde der Expert Advisor die Verbindung nicht unterbrechen und wieder bei 0,1 beginnen.


Versuchen Sie es:

extern double Lot=0.1,K_Martin=2,porog=0.8;
extern int TP=22,SL=20,Magic=233;
extern bool poz1_up=true;//ваш выбор:1-ая покупка или продажа(false)? 
extern bool Trade=true;//торговля разрешить?
bool fix;int init(){fix=true;return(0);}int deinit(){return(0);}
int start(){double oop,ocp,osl,otp,ol,lotos;int closetime=0,lastorder=0,tip=0;if(!Trade)return(0);
if(poz1_up&&fix){OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);fix=0;}  
if(!poz1_up&&fix){OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);fix=0;}
for(int i=0;i<OrdersHistoryTotal();i++)
  {if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
   if(OrderMagicNumber()!=Magic)continue;
   if(closetime<OrderCloseTime())lastorder=OrderTicket();}
if(OrderSelect(lastorder,SELECT_BY_TICKET,MODE_HISTORY))
  {tip=OrderType();oop=OrderOpenPrice();osl=OrderStopLoss();
   otp=OrderTakeProfit();ol=OrderLots();ocp=OrderClosePrice();}
Print("ОРДЕР №--[",OrderTicket(),"-",OrderLots(),"]--","цена открытия--[",OrderOpenPrice(),
        "]--","цена закрытия--[",OrderClosePrice(),"]--","прибыль--[",OrderProfit(),"]");
if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==0)
  {if(tip==OP_SELL){if(osl==ocp){lotos=ol*K_Martin;if(lotos>porog)lotos=Lot; 
     OrderSend(Symbol(),OP_BUY,lotos,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);}
     if(otp==ocp)OrderSend(Symbol(),OP_SELL,Lot,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);} 
  if(tip==OP_BUY){if(osl==ocp){lotos=ol*K_Martin;if(lotos>porog)lotos=Lot;
     OrderSend(Symbol(),OP_SELL,lotos,Bid,0,Bid+SL*Point,Bid-TP*Point,0,Magic,0,Red);} 
  if(otp==ocp)OrderSend(Symbol(),OP_BUY,Lot,Ask,0,Ask-SL*Point,Ask+TP*Point,0,Magic,0,Blue);}}return(0);}
//+------------------------------------------------------------------+
 
Hallo. Können Sie mir sagen, wo ich nachlesen kann, wie ich selbst Transaktionen im Prüfprogramm durchführen kann? Ich würde das zu schätzen wissen.