Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1656

 
MakarFX, ausprobiert - keine Änderung, es öffnet sich nur bei Kauf, und Verkauf wird komplett ignoriert...
 
artem artem #:
MakarFX, ausprobiert - keine Änderung, es öffnet sich nur bei Kauf, und Verkauf wird komplett ignoriert...
Daraus ergibt sich die Schlussfolgerung, dass es keine Bedingungen für das Umschalten von Bools gibt
 
Was müssen Sie dann noch hinzufügen, um die Bedingungen zu erfüllen?
 
artem artem #:
Was sollten wir zu diesen Bedingungen hinzufügen?

Erklären Sie die Logik...

Der erste Fall ist klar: Es gibt ein Signal und es werden keine Aufträge eröffnet...

... und dann verstehe ich nicht, unter welchen Bedingungen Aufträge geöffnet oder geschlossen werden sollten

 
artem artem #:
Was müssen Sie dann noch hinzufügen, um die Bedingungen zu erfüllen?

Versuchen Sie dies

//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()
{
   StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL); 
   
   // Определение направления пересечения мувингов
   if (Init) InitMetod(); 
   
   // Трейлинг стоп открытых позиций
   if (Trailing != 0 ) RealTrailOrder(TrailStop, TrailStep, StopLevel, MagicNumber);
   
   // Ожидание нового бара на графике
   if(timeprev == Time[0]) return;
   timeprev = Time[0];
   
   // Открытие ордера по методу Пуриа
   if(CheckForOpen()==0) // Если сигнал для покупок 
     {
      if(OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slip,Bid-StopLoss*Point,Ask+TakeProfit*Point,"",MagicNumber,0,Blue))
         { Order=false; OrderBuy=true; OrderSell=false; Print("BUY OK"); } 
     } 
   if(CheckForOpen()==1) // Если сигнал для продаж 
     {
      if(OrderSend(Symbol(),OP_SELL,Lots(),Bid,Slip,Ask+StopLoss*Point,Bid-TakeProfit*Point,"",MagicNumber,0,Red))
        { Order=false; OrderBuy=false; OrderSell=true; Print("SELL OK");} 
     }
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
int CheckForOpen() // Открытие ордера по методу Пуриа
  {
   double malw,mas1,mas2,macd;
   int    res=-1, buy=0, sell=0;
   // Считывание параметров индикаторов 3 свечи (4ой)
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,3);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,3);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,3);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,3);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   // Считывание параметров индикаторов 2 свечи (3ей)
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,2);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,2);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,2);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,2);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   // Считывание параметров индикаторов 1 свечи (2ой)
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,1);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,1);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,1);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,1);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   // Считывание параметров индикаторов 0 свечи (1ой)
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0);
   macd=iMACD(NULL,0,15,26,1,PRICE_CLOSE,MODE_MAIN,0);
   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}
   
   if(buy ==4 && OrderSell) res=0;
   if(sell==4 && OrderBuy)  res=1;
   return(res);
  }
//+------------------------------------------------------------------+
 

OK, ich werde alles der Reihe nach erklären, wobei ich versuche, genau zu sein und nicht zu viel zu sagen...

Sie basiert auf einer Trendhandelsstrategie namens "Puria-Methode". Er basiert auf der Kreuzung von drei gleitenden Durchschnitten und der MACD-Bar-Eröffnung. Zwei langsame mit Perioden (75) und (85), Linear Weighted method applied to Low. Ein schneller Durchschnitt mit einer Periode (5), Exponentialmethode, gilt für Close. MACD-Indikator mit den Parametern 15/26/1. Der Einstiegspunkt wird durch das Kreuzen zweier langsamer gleitender Durchschnitte und der Öffnung des MACD-Balkens in die entsprechende Zone mit dem schnellen gebildet (der schnelle und der MACD-Balken sollten sich in derselben Zone befinden):

  • KAUFSIGNAL - Der MA(5) hat den MA(75) und den MA(85) gekreuzt und liegt über ihnen, während der MACD-Balken im positiven Bereich geöffnet ist.
  • VERKAUFSSIGNAL - Der MA(5) wurde gekreuzt und liegt sowohl unter dem MA(75) als auch unter dem MA(85), der MACD hat einen offenen Balken im negativen Bereich.

Der EA setzt einen festen Gewinn und Stop-Loss. Die Größe des Gewinns und des Stopps werden in den Anfangsparametern festgelegt. Aufträge werden erst geschlossen, wenn sie den Take Profit oder Stop Loss erreichen.

Dies ist das, was in den ursprünglichen Puria Expert Advisors enthalten war. Außerdem gibt es in der neuesten Version auch einen Trailing-Stop und die Möglichkeit, nach bestimmten Stunden zu handeln. Funktionen sind nützlich, aber ich bin nicht wirklich an ihnen interessiert.

Nun zu den Ergänzungen, die ich vorgenommen habe bzw. vornehmen möchte:

1. Um ein Geschäft zu eröffnen und auf alle Indikatorbedingungen zu prüfen(Überschreiten einer schnellen (5) von zwei langsamen (75) (85) und Eröffnung eines MACD-Balkens in dieselbe Richtung mit einer schnellen (5)), wurde nur beim Eröffnungskurs einer neuen Kerze (der erste Tick jeder 30-Minuten-Kerze) durchgeführt. Dies wurde bereits erledigt;
  1. Schaffung der Voraussetzungen für die "Nullstellung" von Indikatoren. Zum Beispiel, für eine schnell laufende (5) Wenn sie höher ist als langsam - dann ist das ein Kaufsignal. Wenn er dann nach unten geht und entweder einen von ihnen berührt oder sich zwischen den langsamen (75) und (85) befindet- dann wird das Signal des sich schnell bewegenden Indikators sozusagen "auf Null" gestellt und bleibt in dieser "Null"-Position, solange er die langsamen berührt oder zwischen ihnen bleibt. Wenn danach der schnelle Kurs die beiden langsamen Kurse auf einer Seite kreuzt(auch wenn er zu der Seite zurückkehrt, von der er gekommen ist, bevor er die langsamen Kurse berührt hat) - dann ist das ein Signal dieses Indikators. Beim MACD ist die Situation ähnlich- Nur MACD=0 wird als "Nullstellung" betrachtet(wenn der MACD auf der ersten Kerze z.B. mit 0,0043 eröffnete und auf der zweiten Kerze mit -0,0010, bedeutet dies, dass der MACD auf der zweiten Kerze "Nullstellung" erreicht hat und ein neues Signal erzeugt). Es gibt jedoch einen Zeitpunkt, an dem die schnelle Kerze (5) und der MACD gleichberechtigt sein sollten- wenn (5) seine Position im Verhältnis zur langsamen Kerze nicht ändert und der MACD bei der vorherigen Kerze in der falschen Zone eröffnet hat (kein Einstieg) und bei der nächsten Kerze in der gleichen Zone wie die schnelle Kerze, dann sind alle Bedingungen konvergiert und ein Einstieg in die Order sollte erfolgen. Beachten Sie, dass all dies nur für die Eröffnungskurse der Kerzen gelten sollte - nur für diesen einen Tick;
  1. Und die letzte, um den Expert Advisor auf 4 aufeinanderfolgende Kerzeneröffnungen warten zu lassen:

    1. 1. Eröffnungskurs - (5) über (75) und (85) + MACD-Balken über 0 geöffnet - 1 von 4 Bestätigungen;
    2.Der Eröffnungskurs der zweiten Kerze - (5) über (75) und (85) + MACD-Balken über 0 geöffnet- 2 von 4 Bestätigungen ist;
    3. Der Eröffnungskurs der dritten Kerze - (5) über (75) und (85) + MACD-Balken über 0 geöffnet- 3 von 4 Bestätigungen ist;
    4.Eröffnungskurs der 4. Kerze - (5) über (75) und (85) + MACD-Balken über 0 eröffnet- 4 von 4 Bestätigungen ja- Eröffnen Sie den Kaufhandel auf derselben Kerze (4.).
Die gleiche Situation mit Verkaufsaufträgen, nur in die andere Richtung sollten Indikatoren öffnen. Und es gibt einen wichtigen Punkt - wenn, sagen wir, in irgendeiner Phase von der 1. bis zur 4. Kerze, die Indikatoren ihre Position ändern(z.B. bei der 3. Eröffnungskerze öffnet der MACD-Balken entweder unter 0 oder =0) - dann wird alles zurückgesetzt, weil die Signale den Test bei der Eröffnung der 4-ten Kerze in Folge nicht bestanden haben.


Wenn etwas unklar ist oder Sie Fragen haben, fragen Sie bitte.

 
artem artem #:

OK, ich erkläre alles der Reihe nach, versuche, genau zu sein und nicht zu viel zu sagen...


  1. Schaffen Sie die Voraussetzungen für die "Nullstellung" der Indikatoren.

Dies ist der Nullabgleich.

   if(malw>mas1&&malw>mas2&&macd>0) {buy+=1; sell=0;}
   if(malw<mas1&&malw<mas2&&macd<0) {buy=0; sell+=1;}

Vielleicht habe ich Sie nicht richtig verstanden...

versuchen, einen Screenshot zu machen

 
Ich habe einen Screenshot beigefügt. Wenn Sie etwas nicht verstehen, fragen Sie einfach.
Dateien:
 
artem artem #:
Ich habe einen Screenshot beigefügt. Wenn Sie etwas nicht verstehen, fragen Sie mich einfach.
Ich hab's verstanden, ich werde darüber nachdenken.
 
artem artem #:
Anbei ein Screenshot, falls etwas unklar ist - einfach fragen

Versuchen Sie das hier - lässt es sich an diesen Orten öffnen?

//+------------------------------------------------------------------+
//|                                                  artem artem.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//---
#define  MagicNumber  122122
//---
#include <stdlib.mqh> // Стандартная библиотека
//---
input string s0 = "Баланс";            // 1
input string Template       = "ADX";   // Имя шаблона(without '.tpl')
input double TargetProfit   = 1000000; // Баланс + Прибыль(прибавить к балансу)
input double TargetLoss     = 0;       // Баланс - Убыток(отнять от баланса)
input string s1 = "Размер лота";       // 2
input double Lot            = 0.01;    // размер лота 0 - авт.расчет
input string s2 = "TP SL";             // 3
input double InpTProfit     = 1000;    // Exchange TP
input double InpStopLoss    = 1000000; // Exchange SL
input string s3 = "Индикатор";         // 4
input int    MovingPeriodLw = 13;      // MovingPeriodLw
input int    MovingPeriodS1 = 89;      // MovingPeriodS1
input int    MovingPeriodS2 = 144;     // MovingPeriodS2
input string s4 = "Day & Hour";        // 5
input int    HrStart        = 0;       // время начала торговли
input int    HrEnd          = 23;      // время окончания торговли
//+------------------------------------------------------------------+
int    Monday         = 1;      // Понедельник 1 вкд. 0 выкл.
int    Tuesday        = 1;      // Вторник
int    Wednesday      = 1;      // Среда
int    Thursday       = 1;      // Четверг
int    Friday         = 1;      // Пятница
//+------------------------------------------------------------------+
uint SLEEPTIME=1;
double Price[2];
datetime timeprev=0;
ENUM_TIMEFRAMES TimeFrame= PERIOD_CURRENT;
bool OrderBuy=false,OrderSell=false,Order=false,Init=true,ClOp=true;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- Закрыть Общий профит или профит на паре
   if(ProfitTarget())
     {
      return;
     }
//--- Закрыть профит BUY или SELL на паре
   ProfitOnTick();
// Определение направления пересечения мувингов
   if(Init)
      InitMetod();
// Ожидание нового бара на графике
   if(timeprev == Time[0])
      return;
   timeprev = Time[0];
// Открытие ордера по методу Пуриа
   CheckForOpen();
  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void CheckForOpen() // Открытие ордера по методу Пуриа
  {
   double malw,mas1,mas2,macd;
   int    res;
// Считывание параметров индикаторов
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0);
   macd=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
// Проверяем положение мувмнгов
   if(malw>mas1 && malw>mas2  && OrderSell)
     {
      OrderBuy=true;
      OrderSell=false;
      Order=true;
     }
   if(malw<mas1 && malw<mas2  && OrderBuy)
     {
      OrderBuy=false;
      OrderSell=true;
      Order=true;
     }
// Открываем ордер Buy
   if(macd>0 && OrderBuy && Order)
     {
      res=OrderSend(Symbol(),OP_BUY,Lots(),Ask,3,0,0,"",MagicNumber,0,Blue);
      Order=false;
      return;
     }
// Открываем ордер Sell
   if(macd<0 && OrderSell && Order)
     {
      res=OrderSend(Symbol(),OP_SELL,Lots(),Bid,3,0,0,"",MagicNumber,0,Red);
      Order=false;
      return;
     }
  }
//+------------------------------------------------------------------+
//| Init metod Puria function                                        |
//+------------------------------------------------------------------+
void InitMetod()  // Опредеоение начального пересечения мувингов
  {
   double malw,mas1,mas2;
   malw=iMA(NULL,0,MovingPeriodLw,0,MODE_EMA,PRICE_CLOSE,0);
   mas1=iMA(NULL,0,MovingPeriodS1,0,MODE_LWMA,PRICE_LOW,0);
   mas2=iMA(NULL,0,MovingPeriodS2,0,MODE_LWMA,PRICE_LOW,0);
   if((malw<=mas1 && malw>=mas2) || (malw>=mas1 && malw<=mas2))
     {
      Init=false;
      OrderBuy=true;
      OrderSell=true;
     }
   return;
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double Lots()  // Расчет объема лота
  {
   double Lots;
   if(Lot > 0)
      return(Lot);
   Lots=AccountFreeMargin()/5000;
   Lots=MathMin(15,MathMax(0.01,Lots));
   if(Lots<0.1)
      Lots=NormalizeDouble(Lots,2);
   else
     {
      if(Lots<1)
         Lots=NormalizeDouble(Lots,1);
      else
         Lots=NormalizeDouble(Lots,0);
     }
   return(Lots);
  }
//+------------------------------------------------------------------+
// Permission to trade in this day                                   |
//+------------------------------------------------------------------+
bool TradingDay(int hmin, int hmax) // Определение времени и дня разрешения торговли
  {
   bool dtrade = false;
   switch(DayOfWeek())
     {
      case 1: // Monday
         if(Monday == 1)
            dtrade = true;
         break;
      case 2: // Tuesday
         if(Tuesday == 1)
            dtrade = true;
         break;
      case 3: // Wednesday
         if(Wednesday == 1)
            dtrade = true;
         break;
      case 4: // Thursday
         if(Thursday == 1)
            dtrade = true;
         break;
      case 5: // Friday
         if(Friday == 1)
            dtrade = true;
         break;
      default: //
         dtrade = false;
         break;
     }
   if(dtrade && !(Hour() >= hmin && Hour() <= hmax))
      dtrade = true;
   return dtrade;
  }
//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool ProfitTarget(void)
  {
   bool res=false;
   if(AccountInfoDouble(ACCOUNT_EQUITY)<=TargetLoss ||
      AccountInfoDouble(ACCOUNT_EQUITY)>=TargetProfit)
     {
      CloseAllOrders();
      Sleep(SLEEPTIME*1000);
      CloseAllOrders();
      ExpertRemove();
      DeleteChart();
      PlaySound("expert.wav");
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool ProfitOnTick(void)
  {
   bool res=false;
   double PROFIT_BUY=0.00;
   double PROFIT_SELL=0.00;
   for(int i=OrdersTotal()-1; i>=0; i--) // returns the number of open positions
     {
      if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==Symbol())
        {
         if(OrderSymbol()==Symbol() && OrderType()==OP_BUY)
           {
            PROFIT_BUY=PROFIT_BUY+NormalizeDouble(OrderProfit(),2);
           }
         if(OrderSymbol()==Symbol() && OrderType()==OP_SELL)
           {
            PROFIT_SELL=PROFIT_SELL+NormalizeDouble(OrderProfit(),2);
           }
        }
     }
   int Close_ticketb=0;
   int totalb=OrdersTotal();
   int b = 0;
   for(b = totalb; b >=0; b--)
     {
      if(OrderSelect(b,SELECT_BY_POS) && OrderSymbol()==Symbol())
        {
         //OrderSelect(i,SELECT_BY_POS);
         if(OrderSymbol()==Symbol() && OrderType()==OP_BUY)
           {
            if(PROFIT_BUY<-InpStopLoss || PROFIT_BUY>=InpTProfit)
              {
               Close_ticketb = OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),5);
               PlaySound("ok.wav");
              }
           }
        }
      res=true;
     }
   int Close_tickets=0;
   int totals=OrdersTotal();
   int s = 0;
   for(s = totals; s >=0; s--)
     {
      if(OrderSelect(s,SELECT_BY_POS) && OrderSymbol()==Symbol())
        {
         if(OrderSymbol()==Symbol() && OrderType()==OP_SELL)
           {
            if(PROFIT_SELL<-InpStopLoss || PROFIT_SELL>=InpTProfit)
              {
               Close_tickets = OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),5);
               PlaySound("ok.wav");
              }
           }
        }
      res=true;
     }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void CloseAllOrders(void)
  {
   int iOrders=OrdersTotal()-1, i;
   if(ClOp)
     {
      for(i=iOrders; i>=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && (OrderType()<=OP_SELL) && GetMarketInfo() &&
            !OrderClose(OrderTicket(),OrderLots(),Price[1-OrderType()],0))
            Print(OrderError());
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderDelete(OrderTicket()))
               Print(OrderError());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Function..: OrderError                                           |
//+------------------------------------------------------------------+
string OrderError(void)
  {
   int iError=GetLastError();
   return(StringConcatenate("Order:",OrderTicket()," GetLastError()=",iError," ",ErrorDescription(iError)));
  }
//+------------------------------------------------------------------+
//| Function..: GetMarketInfo                                        |
//+------------------------------------------------------------------+
bool GetMarketInfo(void)
  {
   RefreshRates();
   Price[0]=MarketInfo(OrderSymbol(),MODE_ASK);
   Price[1]=MarketInfo(OrderSymbol(),MODE_BID);
   double dPoint=MarketInfo(OrderSymbol(),MODE_POINT);
   if(dPoint==0)
      return(false);
   return(Price[0]>0.0 && Price[1]>0.0);
  }
//+------------------------------------------------------------------+
//| start function                                                   |
//+------------------------------------------------------------------+
void DeleteChart(void)
  {
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   bool errTemplate;
   while(i<limit)
     {
      currChart=ChartNext(prevChart);
      if(TimeFrame!=PERIOD_CURRENT)
        {
         ChartSetSymbolPeriod(prevChart,ChartSymbol(prevChart),TimeFrame);
        }
      errTemplate=ChartApplyTemplate(prevChart,Template+".tpl");
      if(!errTemplate)
        {
         Print("Error ",ChartSymbol(prevChart),"-> ",GetLastError());
        }
      if(currChart<0)
         break;
      Print(i,ChartSymbol(currChart)," ID =",currChart);
      prevChart=currChart;
      i++;
     }
  }
//+------------------------------------------------------------------+
Grund der Beschwerde: