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

 
Roman.:

Es ist eine Besessenheit, Parameter per Referenz übergeben zu wollen. :-)



Wie sonst? Das Gleiche 100 Mal berechnen?
 
hoz:


Ja, ich habe mich geirrt. Generell. Wenn es hier klar ist, wird die Pending Order nur durch den Preis gesetzt.

Hier ist der Code:

Die Frage ist im Grunde genommen nicht kompliziert. Ich habe formale Parameter priceForBuy und priceForSell an die Funktion Trade(int signal, double& priceForBuy, double& priceForSell) übergeben. Die Parameter werden über die Links übergeben. Wird das nicht so gemacht? Die Funktionen sind lokal, nicht global.

Während der Kompilierung ist ein Fehler aufgetreten:

Woher kommt der Fehler? Ich habe diese Parameter bereits in der FunktionGetPriceToInput() definiert.

Die Variablen priceForBuy und priceForSell wurden nicht gefunden - sagt der Compiler. Sie müssen herausfinden, wie Sie die Werte der Variablen per Referenz übergeben können.
 
hoz:

Wie könnte es anders sein? Müssen Sie dasselbe 100 Mal wieder und wieder berechnen?

Machen Sie das Signal zum Teil des Experten, wie im Lehrbuch, und Sie werden zufrieden sein!

Ich habe Ihnen vorhin alle Links in diesem Thread gegeben...


 
hoz:

Wie könnte es anders sein? Müssen Sie dieselbe Sache 100 Mal berechnen?
Die Idee ist RICHTIG, die Umsetzung ist SCHLECHT! :)))
 

Nun, es gibt hier keine konkreten Beispiele:

https://docs.mql4.com/ru/basis/variables/formal

Er wird oben geschrieben, wo die Funktionsparameter stehen, wie bei mir, d.h. & nach dem Datentyp.

 
hoz:

Nun, es gibt hier keine konkreten Beispiele:

https://docs.mql4.com/ru/basis/variables/formal

Sie wird oben geschrieben, wo die Funktionsparameter stehen, wie bei mir, d.h. & nach dem Datentyp.

Vielleicht lässt es sich auf diese Weise kompilieren:

//+-------------------------------------------------------------------------------------+
//| Получение цены входа в покупку или в продажу                                        |
//+-------------------------------------------------------------------------------------+
bool GetPriceToInput (int signal)
{
  firstBarClosed = iClose(Symbol(),1440,2);
  secondBarClosed = iClose(Symbol(),1440,1);

    double deltaForSell = (firstBarClosed - secondBarClosed)/2;
    double priceForSell = secondBarClosed - deltaForSell;


    double deltaForBuy = (secondBarClosed - firstBarClosed)/2;
    double priceForBuy = secondBarClosed + deltaForBuy;  
    return (Trade (signal, priceForBuy, priceForSell));
}
//+-------------------------------------------------------------------------------------+
//| Функция Start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
  int signal = GetSignal();
    
    if (signal != SIGNAL_NO)
      if(!GetPriceToInput (signal))
      return(0);

  return(0);
}

obwohl die Codestruktur eher "linkslastig" ist...

 
TarasBY:

Vielleicht lässt es sich auf diese Weise kompilieren:

obwohl die Codestruktur irgendwie "linkshändig" ist...


Nun... ich war derjenige, der ihn geschrieben hat. Singen Sie die erste Kelle. :)
 

Ich habe den Experten ein wenig umgeschrieben. Das ist dabei herausgekommen:

//+------------------------------------------------------------------+
//|                                                       2 Days.mq4 |
//|                                                              hoz |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

extern string    A1 = "Объем сделки. Если i_lots = 0, то считается в процентах";
extern double    i_lots = 0.1;
extern string    A2 = "Управление рисками";
extern double    i_sl = 15,
                 i_tp = 10;
extern int  slippage,
            price_b,
            price_a;

extern string    Z1 = "=== Прочие настройки ===";
extern string    i_openOrderSound = "ok.wav";
extern int       i_magicNumber = 400021;

double firstBarClosed,
       secondBarClosed;
 
// Идентификаторы типов сигналов
#define SIGNAL_BUY              1                     // Сигнал на покупку
#define SIGNAL_SELL            -1                     // Сигнал на продажу
#define SIGNAL_NO               0                     // Нет сигнала

#include <stderror.mqh>

//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации эксперта                                                     |
//+-------------------------------------------------------------------------------------+
int init()
{
   
   return(0);
}
//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации эксперта                                                     |
//+-------------------------------------------------------------------------------------+
int deinit()
{
   return(0);
}
//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal, double& priceForBuy, double& priceForSell)
{
 // FindOrders();
  priceForBuy = NormalizeDouble(priceForBuy,Digits);
  priceForSell = NormalizeDouble(priceForSell,Digits);
  
  if (signal == SIGNAL_BUY)
     if (!OrderSend(Symbol(),OP_BUYLIMIT, i_lots,priceForBuy,slippage,i_sl,i_tp,"",i_magicNumber,3))
     return(false);
     
  if (signal == SIGNAL_SELL)
     if (!OrderSend(Symbol(),OP_SELLLIMIT,i_lots,priceForSell,slippage,i_sl,i_tp,"",i_magicNumber,3))
     return(false);
     
  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Получение цены входа в покупку или в продажу                                        |
//+-------------------------------------------------------------------------------------+
double GetPriceToInput(int signal)
{
  firstBarClosed = iClose(Symbol(),1440,2);
  secondBarClosed = iClose(Symbol(),1440,1);
    
  double deltaForSell = (firstBarClosed - secondBarClosed)/2;
  double priceForSell = secondBarClosed - deltaForSell;
    
//  return(priceForSell);

  
  double deltaForBuy = (secondBarClosed - firstBarClosed)/2;
  double priceForBuy = secondBarClosed + deltaForBuy;  
  return(Trade(signal, priceForBuy, priceForSell));
}
//+-------------------------------------------------------------------------------------+
//| Генерация сигнала закрытия, покупки или продажи                                     |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
  if(firstBarClosed > secondBarClosed)
  return(SIGNAL_BUY);

  if(firstBarClosed < secondBarClosed)
  return(SIGNAL_NO);
}
//+-------------------------------------------------------------------------------------+
//| Функция Start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
  int signal = GetSignal();
    
    if (signal != SIGNAL_NO)
      if(!Trade(signal, priceForBuy, priceForSell))
      return(0);

  return(0);
}

 

Übrigens, der Fehler:

'priceForBuy' - variable not defined    E:\Insall'd soft's\Forex\Admiral Markets\experts\2 Days.mq4 (103, 25)
'priceForSell' - variable not defined   E:\Insall'd soft's\Forex\Admiral Markets\experts\2 Days.mq4 (103, 38)

genau in derStartfunktion vorkommt, sind diese Variablen nicht definiert, auch nicht an anderer Stelle. Es muss also etwas hinzugefügt werden, um zu beginnen?

 
hoz:

Übrigens, der Fehler:

genau in derStartfunktion vorkommt, sind diese Variablen nicht definiert, auch nicht an anderer Stelle. Es muss also etwas hinzugefügt werden, um zu beginnen?

Sie müssen in start() definiert und per Referenz an die aufgerufene Funktion übergeben werden.
 
Reshetov:
Sie müssen in start() definiert und per Referenz an die aufgerufene Funktion übergeben werden.


Dies ist der einfachste Weg. Aber ich beobachte Artikel, die von einem Programmierer geschrieben wurden, und in der Funktion start() ist überhaupt nichts definiert.

Hier ist ein Link zu seinem Berater:

http://www.forextrade.ru/media/Image/MQLabs/181_ag/ChannelByMACross_Expert.mq4

Mich interessiert vor allem, wie er intelligenten Code schreibt. Ich möchte also lernen, wie man alles in separate Funktionen schreibt und nur das Wesentliche hinzufügt, ohne dort Variablen zu deklarieren.

Wenn wir eine Variable per Verweis an eine Funktion übergeben, arbeiten wir mit einem Puffer der ursprünglichen Variable, nicht mit ihrem separaten Double. Das bedeutet, dass es keine Rolle spielt, in welcher Funktion wir sie zuvor deklariert haben. Nicht wahr?