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

 
d1w4m3:


Danke für die Antwort, aber ich habe gerade erst begonnen, für ein paar Wochen zu lernen, wie man dies in Code zu implementieren, oder sagen Sie mir, wo zu lesen, bitte. Oder nach Igor Kim?

Und doch wird er eine Position öffnen, die nicht dem System entspricht, wenn er gerade seine Arbeit aufnimmt, Ihr Zustand vermeidet dieses Problem nicht.

Und wenn Sie darüber nachdenken? Warum lässt sich das Problem nicht vermeiden?

Wenn er mit der Arbeit beginnt und vorher noch nicht gearbeitet hat (im Allgemeinen beim ersten Durchlauf), dann hat es seine Position noch nicht gegeben, und die Logik wird zeigen, dass die letzte geschlossene Position einfach noch nicht existiert. Das bedeutet, dass er weder beim Stop noch beim Take geschlossen werden konnte, was wiederum die Eröffnung einer Position auf das Signal erlaubt.

Nicht wahr?

 
Artyom Trishkin:

Und wenn Sie darüber nachdenken? Warum lässt sich das Problem nicht vermeiden?

Wenn es anfängt zu arbeiten, und wenn es vorher nicht funktioniert hat (erster Lauf überhaupt), hat es noch keine Position gegeben, und die Logik wird zeigen, dass die letzte geschlossene Position einfach noch nicht existiert. Das bedeutet, dass er weder beim Stop noch beim Take geschlossen werden konnte, was wiederum die Eröffnung einer Position auf das Signal erlaubt.

Nicht wahr?


Das ist die Sache: durch ein Signal! Aber die Bedingung kann nicht in Takt 2 erfüllt sein (sobald der Indikator den Puffer verändert hat), sondern in jedem zweiten Takt (danach läuft natürlich alles über das System). Das Problem ist in der Bedingung, um Aufträge zu öffnen, wie es zu beheben, aber auf der 2. bar nach dem Wechsel des Indikators Puffer?

void OnTick()

{
uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 0, n), 4);
dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 1, n), 4);
if(DN_Trend()==true)
{
if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
wenn (Ticket > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Verkaufsfehler");
}

}


 
d1w4m3:


Nun, der Punkt ist, dass es auf dem Signal basiert! Aber die Bedingung kann nicht am 2. Balken erfüllt werden (sobald der Indikator den Puffer geändert hat), sondern an jedem zweiten Balken (danach funktioniert natürlich alles mit dem System). Das Problem ist in der Bedingung, um Aufträge zu öffnen, wie es zu beheben, aber auf der 2. bar nach dem Wechsel des Indikators Puffer?

void OnTick()

{
uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 0, n), 4);
dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period, method, price, 1, n), 4);
if(DN_Trend()==true)
{
if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
wenn (Ticket > 0)
{
SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
if (OrderSelect(ticket, SELECT_BY_TICKET))
if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
Print("Verkaufsfehler");
}

}


Fügen Sie den Code korrekt ein. Im Menü des Nachrichteneditors gibt es eine Schaltfläche SRC.
Ich habe von Ihren Erklärungen nichts verstanden.
 
d1w4m3:


Das ist der Punkt! Aber die Bedingung kann nicht in Takt 2 erfüllt sein (sobald der Indikator den Puffer geändert hat), sondern in jedem zweiten Takt (danach funktioniert natürlich alles mit dem System). Das Problem ist in der Bedingung, um Aufträge zu öffnen, wie es zu beheben, aber auf der 2. bar nach dem Wechsel des Indikators Puffer?

void OnTick()
{
  uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 0, n), 4);
  dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 1, n), 4); 
  
if(DN_Trend()==true)
{
  if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
  { 
   ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
      if (ticket > 0)
      {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
           Print("Ошибка на продажу");
      }

  }


1. So würde der Code aussehen, wenn er korrekt eingefügt würde. Es gibt einen Grund, warum sich die Entwickler das ausgedacht haben...

2. ein subtiler Hinweis: Wo befinden sich Open[4] und Close[4] im Verhältnis zu den Indikatorwerten?

 
extern int TakeProfit  = 200;
extern double Lots     = 0.1;
extern int StopLoss    = 52;
extern int Magic       = 1111;
extern int Slippage    = 3;
extern int n           = 3; // На какую свечу открывать ордер
//------------------------------------------------------------------
extern int  LevelWLoss  = 1;      // Уровень безубытка
extern int  LevelProfit = 30;     // Уровень профита
//------------------------------------------------------------------
extern string    Slope  = "Параметры Slope";
extern int       period = 163; 
extern int       method = 3;                         
extern int       price  = 0;    
//------------------------------------------------------------------
double uptr, SL, TP, dntr;
int    ticket, nd;
bool   fm;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   if (Digits == 3 || Digits == 5)
   {
       TakeProfit  *=10;
       StopLoss    *=10;
       Slippage    *=10;
       LevelWLoss  *=10;
       LevelProfit *=10;
   }
   return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 0, n), 4);
  dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 1, n), 4); 
  
if(DN_Trend()==true)
{
  if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)
  { 
   ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);
      if (ticket > 0)
      {
         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
           Print("Ошибка на продажу");
      }
  }
}//if(DN_Trend()==true)

if(UP_Trend()==true)
{
   if( CountBuy() == 0  && Ask > uptr && Open[3] > uptr && Close[3] > uptr  )
  {
   ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "Sloper", Magic, 0, Blue);
      if (ticket>0)
      {
         TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
         SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
         
         if (OrderSelect(ticket, SELECT_BY_TICKET))
            if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
               Print("Ошибка на покупку");
       }
    }
}//if(UP_Trend()==true)

      if ( CountSell()>0  && Open[3] > uptr && Close[3] > uptr && UP_Trend()==true)
      {
      for(int i = OrdersTotal() -1; i>=0; i--)
          {
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
            if (OrderMagicNumber() == Magic && OrderType() == OP_SELL)
            if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))
            Print("Ошибка");
            }
          }
      }
      if ( CountBuy()>0 && Open[3] < dntr && Close[3] < dntr && DN_Trend()==true)
      {
      for(int i = OrdersTotal() -1; i>=0; i--)
          {
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
            if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
            if(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))
            Print("Ошибка");
            }
          }
      }
      //+переход в безубыток+
   for( int i=0; i<OrdersTotal(); i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
        if(OrderSymbol()== Symbol() && OrderMagicNumber()==Magic)
          {
            if(OrderType()==OP_BUY) 
              {
                if(OrderStopLoss()-OrderOpenPrice()<LevelWLoss*Point) 
                 {
                   if(Bid-OrderOpenPrice()>LevelProfit*Point) 
                 {
                  fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+LevelWLoss*Point,OrderTakeProfit(),CLR_NONE);
                 }
              }
            }
           }
         if(OrderType()==OP_SELL) 
           {
            if(OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*Point) 
              {
               if(OrderOpenPrice()-Ask>LevelProfit*Point) 
                 {
                  fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-LevelWLoss*Point,OrderTakeProfit(),CLR_NONE);
                 }
              }
           }
       
        }
     }
     
//------------  комментарии -----------------+     
  if(UP_Trend()) Comment("Восходящий тренд ", uptr);
  if(DN_Trend()) Comment("Нисходящий тренд ", dntr);
 
 }
//+------------------------------------------------------------------+
int CountSell()
{
   int count = 0;
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
        if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
    {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
                    count++;   
    }
   }
     return(count);
}
//+------------------------------------------------------------------+
int CountBuy()
{
   int count = 0;
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
        if(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))
    {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
                    count++;   
    }
   }
     return(count);
}
//+------------------------------------------------------------------+
bool UP_Trend()
{
  if(uptr > 0 && uptr != 2147483647.0) return(true);
  return(false);
}
//+------------------------------------------------------------------+
bool DN_Trend()
{
  if(dntr > 0 && dntr != 2147483647.0) return(true);
  return(false);
}
//+------------------------------------------------------------------+
 

Wenn wir Ihre Bedingung einfügen " Das bedeutet, dass er weder beim Stop noch beim Take geschlossen werden konnte, was wiederum die Erlaubnis gibt, eine Position auf das Signal zu eröffnen. "

Und mein Signal ist"if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3]< dntr)" (zusammen mit der Verschiebung des Indikators n=3),

Es stellt sich heraus, dass er, wenn er sofort auf dem Chart platziert wird, bei einem Abwärtstrend ab dem Zeitpunkt des Starts an der dritten Kerze öffnet, und dann, wenn es ein Signal gibt, öffnet er nach Bedarf.

 
d1w4m3:

Wenn wir Ihre Bedingung einfügen " Das bedeutet, dass er weder beim Stop noch beim Take geschlossen werden konnte, was wiederum die Erlaubnis gibt, eine Position auf das Signal zu eröffnen. "

Und mein Signal ist"if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3]< dntr)" (zusammen mit der Verschiebung des Indikators n=3),

Es stellt sich heraus, dass er, wenn er sofort auf dem Chart platziert wird, bei einem Abwärtstrend zum Zeitpunkt des Starts an der dritten Kerze geöffnet wird, und dann, wenn es ein Signal gibt, wird er nach Bedarf geöffnet.

Ich kann nichts verstehen. Was haben Sie, was Sie nicht verstehen? Sie können nicht feststellen, ob die letzte Position bei Stop oder Take geschlossen wurde? Sie können in Ihrem Code keine Stelle finden, an der Sie diese Bedingung überprüfen können?

Oder was können Sie nicht tun?

Wie kann sie sich bei der dritten Kerze öffnen? Oder erklären Sie, was "sie wird sich bei der dritten Kerze öffnen" bedeutet? Was soll das überhaupt bedeuten?
 

Wie speichere ich jedes Mal, wenn ein Auftrag aufgrund eines Indikatorsignals eröffnet wird, den Typ dieses Signals in einer Variablen?

Es gibt einen Fehler (wenn ich den EA laufen lasse), der Auftrag öffnet sich nicht zu Beginn eines Trends (nicht nach einer Änderung in der Farbe des Indikators), weil meine Bedingung sich nicht auf bestimmte Kerzen bezieht, sondern sagt, wenn der Trend nach oben oder unten ist, öffnet sich zu Beginn von 3 Kerzen


 

Guten Tag an alle.

Ich frage mich, wie ich die Arbeitsstatistiken in EXCEl auswerten kann.

Wer kann mir sagen, was über DDE aus mt4 gezogen werden kann und wo ich alle zulässigen Funktionen für die Übertragung nach Excel bekomme

Wäre für Hilfe sehr dankbar

 
Maxim Shershnev:

Guten Tag an alle.

Ich frage mich, wie ich die Arbeitsstatistiken in EXCEl analysieren kann.

Wer kann mir sagen, was über DDE aus mt4 extrahiert werden kann und wo ich alle zulässigen Funktionen für die Übertragung nach Excel bekomme

Wäre für Hilfe sehr dankbar

Es gibt alles, was Sie brauchen. Das .csv-Datensatzformat schreibt in excell
Файловые операции - Справочник MQL4
Файловые операции - Справочник MQL4
  • docs.mql4.com
Файловые операции - Справочник MQL4
Grund der Beschwerde: