[Archiv!] Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Könnte nirgendwo ohne dich hingehen - 2. - Seite 497

 
Bitte teilen Sie uns mit, wie man einen Auftrag nur einmal auf einem neuen Balken eröffnet ????
 

Code in den EA einbetten, ich hatte etwas Ähnliches, bis ich es gelöscht habe, ich benutzte einen stündlichen Zeitrahmen

orderselect - wählt den letzten Auftrag in der Historie aus

den Zeitpunkt der Schließung nehmen und die Sperrstunde herausziehen

und setzen Sie vor dem Öffnen des Auftrags eine Bedingung, dass die aktuelle Stunde NICHT gleich dem Zeitpunkt des Auftragsschlusses aus der Historie ist

 

Bitte helfen Sie mir bei diesem Problem, meine TP-Variable wird nach der zweiten Preisaktualisierung zu Null, d.h., der Advisor öffnet eine Order, und TP und Bid sind beide nicht gleich Null, dann wird der Preis wieder aktualisiert und TP ist Null, obwohl dies nicht im Code ist, ich hatte ein Problem mit dem Hochziehen von SL, aber jetzt stellt sich heraus, dass das Problem in der Definition von TP liegt

int start()
{
//----
double TP;
double SL;
if (OrdersTotal()==0)
{
OrderSend(Symbol(),OP_BUY,0.01,Ask,3,0,Bid+4*Point);
OrderSelect(OrdersTotal()-1,SELECT_BY_POS);
TP=OrderTakeProfit();
}
Alert ("TP=" + TP);
Alert ("Bid=" + Bid);
if (OrdersTotal()>0)
{
if (TP-Bid<3*Point)
{
Alert ("Approaching TP by 1 or 2");
Alert ("TP=" + TP);
Alert ("Bid=" + Bid);
}
}
//----
return(0);
}

 
LazarevDenis:

Bitte helfen Sie mir mit diesem Problem, meine TP-Variable ist Null nach dem zweiten Preis Update, d.h., der EA öffnet eine Bestellung und zeigt Werte von TP und Bid, beide sind nicht gleich Null, dann wird der Preis wieder aktualisiert und TP ist Null, obwohl in den Code, keine solche Befehle, ich hatte ein Problem mit Ziehen SL nach oben, aber jetzt stellt sich heraus, dass das Problem in der Definition von TP ist

double TP, SL;


int start()
{
//----

if (OrdersTotal()==0)
{
OrderSend(Symbol(),OP_BUY,0.01,Ask,3,0,Bid+4*Point);
OrderSelect(OrdersTotal()-1,SELECT_BY_POS);
TP=OrderTakeProfit();
}
Alert ("TP=" + TP);
Alert ("Bid=" + Bid);
if (OrdersTotal()>0)
{
if (TP-Bid<3*Point)
{
Alert ("Приблизился к ТП на 1 или 2");
Alert ("TP=" + TP);
Alert ("Bid=" + Bid);
}
}
//----
return(0);
}
Versuchen Sie es auf diese Weise...
 
VOLDEMAR:
Bitte teilen Sie uns mit, wie man eine Order nur einmal auf einem neuen Balken eröffnet ????

Lesen Sie hier: https://www.mql5.com/ru/forum/134437
 
Cmu4, vielen Dank, Sie haben uns sehr geholfen.
 

Hallo zusammen!

In der Strategie gibt es zwei Signale: ein primäres und ein sekundäres. Ein Handel wird eröffnet, wenn das zweite Signal nicht später als 12 Stunden erscheint. Frage: Wie kann ich meinem Expert Advisor beibringen, nicht auf das Signal zu reagieren, wenn es nach 12 Stunden erscheint? Wenn Sie bitte ein konkretes Codebeispiel nennen können

 
demlin:

Hallo zusammen!

In der Strategie gibt es zwei Signale: ein primäres und ein sekundäres. Ein Handel wird eröffnet, wenn das zweite Signal spätestens 12 Stunden später erscheint. Frage: Wie kann ich meinem Expert Advisor beibringen, nicht auf das Signal zu reagieren, wenn es nach 12 Stunden erscheint? Wenn Sie mir bitte ein Beispiel für den Code geben können


Hallo Dmitri. Ich für meinen Teil bin bereit, Ihnen die folgende Variante anzubieten. Für eine Analogie, siehe die Auslösung der Handelskriterien dieses Artikels - es gibt auch zwei Signale - nämlich - siehe nach der zweiten Abbildung "Das erste, was man auf dem DeMarker-Chart abwarten sollte, ist der Moment, wenn der DeMarker die schnellen und langsamen MA-Linien um 0,7 für eine Short-Position kreuzt. Dies ist das erste vorläufige Signal. Dann warten wir auf die Überquerung der MA-Linien selbst. Dies ist das Hauptsignal, nach dem die Taichi-Anzeige abgelesen werden kann. Wenn die MA-Linien nicht gekreuzt werden, gilt dies als falsches Signal und die Preisbewegung wird fortgesetzt. So ist es in meinem Code implementiert - in der Einbeziehung von Eulen, die für die Auslösung von Handelskriterien verantwortlich sind.

Der Haupttrick besteht darin, die beiden unter (am Ende) des Einschlusses zu bearbeiten, indem man Flaggen setzt und zurücksetzt, wenn das eine oder andere Handelskriterium ausgelöst wird.

//--------------------------------------------------------------------
// Criterion.mqh
// 
//--------------------------------------------------------------- 1 --
// Функция вычисления торговых критериев.
// Возвращаемые значения:
// 10 - открытие Buy  
// 20 - открытие Sell 
// 0  - значимых критериев нет
// 
//--------------------------------------------------------------- 2 --
// Внешние переменные:
extern string A5 = "Параметры";
//extern int       Period_K = 5;            // Период K
//extern int       Period_D = 3;            // Период D
//extern int       Slowing = 3;             // Замедление

extern int Tenkan=9;
extern int Kijun=26;
extern int Senkou=52;
extern int FlatSE=7;

extern int DeMarker=25;
extern int FastMA=14;
extern int SlowMA=25;
extern double DeMarker_OpenLevel_Sell = 0.7;
extern double DeMarker_OpenLevel_Buy = 0.7;
 bool   DeMarker_Buy_signal=false, DeMarker_Sell_signal=false,
       MA_Buy_signal=false, MA_Sell_signal=false;



extern int t_trend_period =6; // для оптимизации по всем периодам от 0 до 7 шаг 1
                              // на каком ТФ работаем: 1-М1, 2-М5, 3-М15, 4-М30, 5-Н1, 6 - Н4, 7-день
 

//--------------------------------------------------------------- 3 --
int Criterion()                        // Пользовательская функция
  {
  //--------------------------------------------------------------- 4 --
 int trend_period=GetPeriod(t_trend_period); // для выбора оптимального значения рабочего ТФ

   // Параметры технич. индикат:
                 
double Taichi_1 = iCustom (Symbol(), trend_period, "Cronex Taichi",Tenkan, Kijun, Senkou, FlatSE, 0, 1);
double TaichiFor_1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 3, 1);
double Signal_1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 1, 1);
double SSignal_1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 2, 1);

double FlatBuffer1 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 4, 1);
double FlatBuffer2 = iCustom (Symbol(), trend_period, "Cronex Taichi", Tenkan, Kijun, Senkou, FlatSE, 5, 1);

double DeMarker_1 = iCustom (Symbol(), trend_period, "Cronex DeMarker",DeMarker, FastMA, SlowMA, 0, 1);
double DeMarker_2 = iCustom (Symbol(), trend_period, "Cronex DeMarker",DeMarker, FastMA, SlowMA, 0, 2);

double FastMA_1 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 1, 1);
double FastMA_2 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 1, 2);

double SlowMA_1 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 2, 1);
double SlowMA_2 = iCustom (Symbol(), trend_period, "Cronex DeMarker", DeMarker, FastMA, SlowMA, 2, 2);

//--------------------------------------------------------------- 5 --
   // Вычисление торговых критериев
   
   if(( (type_op_DeMarker(DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (DeMarker_Buy_signal == true && DeMarker_Sell_signal==false)) &&  // когда DeMarker пересекает медленую (выше уровня бай (0.7)) для лонг
      ( (type_op_MA (DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (MA_Buy_signal==true && MA_Sell_signal==false)) && // пересечение МА DeMarkers
   
   
      (iClose(Symbol(), trend_period,1) > Taichi_1 && Taichi_1 > TaichiFor_1 && Signal_1 > SSignal_1 && FlatBuffer1==0 && FlatBuffer2==0))
     
         {
           Print ("Taichi_1 = ", Taichi_1, "TaichiFor_1 = ",TaichiFor_1, "Signal_1 = ", Signal_1, "SSignal_1 = ",SSignal_1, "FlatBuffer1 = ", FlatBuffer1, "FlatBuffer2 = ", FlatBuffer2);
           Print ("DeMarker_1 = ", DeMarker_1, "DeMarker_2 = ",DeMarker_2, "FastMA_1 = ", FastMA_1, "FastMA_2 = ",FastMA_2, "SlowMA_1 = ", SlowMA_1, "SlowMA_2 = ", SlowMA_2);
           return(10);                      // Открытие Buy    
         }
        
   if(( (type_op_DeMarker(DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_SELL) || (DeMarker_Buy_signal==false && DeMarker_Sell_signal==true)) &&  // когда DeMarker пересекает медленую (ниже уровня селл) для шорт
      ( (type_op_MA (DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_SELL) || (MA_Buy_signal==false && MA_Sell_signal==true)) && // пересечение МА DeMarkers
        
      (iClose(Symbol(), trend_period,1) < Taichi_1 && Taichi_1 < TaichiFor_1 && Signal_1 < SSignal_1 && FlatBuffer1==0 && FlatBuffer2==0))
        {
           Print ("Taichi_1 = ", Taichi_1, "TaichiFor_1 = ",TaichiFor_1, "Signal_1 = ", Signal_1, "SSignal_1 = ",SSignal_1, "FlatBuffer1 = ", FlatBuffer1, "FlatBuffer2 = ", FlatBuffer2);
           Print ("DeMarker_1 = ", DeMarker_1, "DeMarker_2 = ",DeMarker_2, "FastMA_1 = ", FastMA_1, "FastMA_2 = ",FastMA_2, "SlowMA_1 = ", SlowMA_1, "SlowMA_2 = ", SlowMA_2);
           return(20);  
        }                       // Открытие Sell 
  
//--------------------------------------------------------------- 6 --
   return(0);                          // Выход из пользов. функции
  }
//--------------------------------------------------------------- 7 --

//для оптимизации по всем ТФ
int GetPeriod(int period)
{int periodres;
 switch(period)
  {
   case 1: periodres=1;break;
   case 2: periodres=5;break;
   case 3: periodres=15;break;
   case 4: periodres=30;break;
   case 5: periodres=60;break;
   case 6: periodres=240;break;
   case 7: periodres=1440;break;
   case 8: periodres=10080;break;
   default: periodres=1;break;
  }
return(periodres);
} 


int type_op_DeMarker(double D1, double D2, double F1, double F2, double S1,double S2)// Функция - условия для входа в рынок и сохранения их через переменные Buy_signal и Sell_signal (даже после их сработки - до отмены
               // противоположными сигналами)
               
{
      
     if (D2-S2 < 0 && D1-S1 > 0 && D1 > F1  && D1 < DeMarker_OpenLevel_Buy)
          {
             DeMarker_Buy_signal=true;
             DeMarker_Sell_signal=false;
             return(OP_BUY);
          } 
  
      if (D2-S2 > 0 && D1-S1 < 0 && D1 < F1 && D1 > DeMarker_OpenLevel_Sell)                                                                                   
          {
             DeMarker_Buy_signal=false;
             DeMarker_Sell_signal=true;
             return(OP_SELL);
          }   
   else return(-1);
     
}

int type_op_MA(double d1, double d2, double f1, double f2, double s1,double s2) // условия для входа в рынок и сохранения их через переменные Buy_signal и Sell_signal (даже после их сработки - до отмены
               // противоположными сигналами)
               

  {
          
     if (f2 - s2 < 0 && f1 - s1 > 0)
          {
             MA_Buy_signal=true;
             MA_Sell_signal=false;
             return(OP_BUY);
          } 
  
      if (f2-s2 > 0 && f1-s1 < 0)                                                                                                               
          {
             MA_Buy_signal=false;
             MA_Sell_signal=true;
             return(OP_SELL);
          }   
   else return(-1);

  }

Sie speichern zusätzlich die aktuelle Zeit, wenn das Hauptkriterium mit TimeCurrent ausgelöst wird, d.h. Sie geben einen Ausdruck vom Typ x = TimeCurrent vorreturn(OP_BUY); oderreturn(OP_SELL); an, wobei x analog zur erstenint_op_DeMarker-Funktion eine globale Variable vom Typ datetime ist. Dann machen Sie dasselbe mit der zweitenint type_op_MA Funktion... - dort speichern Sie die Variable y = TimeCurrent;

Dann vergleichen Sie den Wert dieser beiden Variablen mit dem Pluszeichen im Block der Handelskriterienberechnung (es stellt sich heraus, dass Sie nicht analog mit UTC-Werten arbeiten müssen - stattdessen nehmen Sie einen Vergleich der Empfangszeit Ihrer beiden Handelssignale):

 // Вычисление торговых критериев
   
   if(( (type_op_DeMarker(DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (DeMarker_Buy_signal == true && DeMarker_Sell_signal==false)) &&  // когда DeMarker пересекает медленую (выше уровня бай (0.7)) для лонг
      ( (type_op_MA (DeMarker_1,DeMarker_2,FastMA_1, FastMA_2, SlowMA_1, SlowMA_1)==OP_BUY) || (MA_Buy_signal==true && MA_Sell_signal==false)) && // пересечение МА DeMarkers
   
   
      ((x+43200) < y )) //43200 - это количество секунд в 12-ти часах
     
         {
           Print ("Время сработки первого условия х(в секундах) = ", х, " Время сработки второго условия y (в секундах) = ", y);
           Print ("DeMarker_1 = ", DeMarker_1, "DeMarker_2 = ",DeMarker_2, "FastMA_1 = ", FastMA_1, "FastMA_2 = ",FastMA_2, "SlowMA_1 = ", SlowMA_1, "SlowMA_2 = ", SlowMA_2);
           return(10);                      // Открытие Buy    
         }

P.S. Außerdem sende ich Ihnen eine Funktion, mit der Sie den Wert der Arbeits-TF optimieren können.

P.P.S. So ist diese Codestruktur in meinem Code organisiert. Ich schließe nicht aus, dass es wesentlich bessere Code-Varianten gibt, um solche Bedingungen des EA zu erfüllen. :-)))

 

Wie berechne ich in meinem EA einen Gewinn für ein Währungspaar?

Ich habe z. B. sieben Kaufaufträge für den Euro zu unterschiedlichen Kursen offen. Wie berechne ich einen Gewinn für den Euro, ohne andere Aufträge für andere Paare zu beeinträchtigen? ????

 

SelectOrder verwenden, um alle offenen Aufträge zu scannen

das gewünschte Paar prüfen (OrderSymbol)

dann fügen Sie den Gewinn zu einer beliebigen Variablen hinzu, wenn es sich um den erforderlichen OrderProfit handelt

Hier ist ein Link mit nützlichen Funktionen https://docs.mql4.com/ru/trading/OrderSelect

Auf der linken Seite befindet sich ein Menü mit den Operationen, die dort beschrieben sind