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

 

Ich habe einen Teil des Codes überarbeitet, um den ich gestern gebeten hatte. Alles ist jetzt so, wie es sein sollte. Nachfolgend sind 3 Funktionen aufgeführt, um zu zeigen, was verwendet wird, um das ursprüngliche Signal zu erhalten, da dies nur der Anfang von dem ist, was ich schreibe.

//+-------------------------------------------------------------------------------------+
//| Открытие позиций                                                                    |
//+-------------------------------------------------------------------------------------+
bool Trade(int signal)
{
   double fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   double slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   
   DeletePendingOrders();
   
   if (signal == SIGNAL_BUY)
       if (!OpenBuy(fastMa, slowMa))
          return(false);
   
   if (signal == SIGNAL_SELL)
       if (!OpenSell(fastMa, slowMa))
          return(false);
       
   return (true);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
   // Получаем значения машек для дальнейших рассчётов
   double fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   double slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
 //  double filtrMa = iMA(NULL,i_TF,i_filtrMaPeriod,0,MODE_SMA,MODE_CLOSE,0);
   
   if (FindOrders() > 0)                                 // Если есть открытые ордера, то..
       return (SIGNAL_NO);                               //..ничего не делаем
   
   if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_UP)      // Если машки указывают вверх
       if ( (MathAbs(High[0] - fastMa) <= 0.1 * pt ) || ( MathAbs(Low[0] - fastMa) <= 0.1 * pt) )     // Цена вблизи 0.1пп от fastMa
           return(SIGNAL_BUY);      // Функция возвращает сигнал покупки
       
 //  if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_DOWN)
   //    return(SIGNAL_SELL);
   
   return (SIGNAL_NO);
}

Hier ist die Kauffunktion:

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(double fastMa, double slowMa)
{
   int ticket = -1;
   
//   if ( (MathAbs(High[0] - fastMa) <= 0.1 * pt ) || ( MathAbs(Low[0] - fastMa) <= 0.1 * pt) )
   {
       if ((fastMa + i_thresholdFromMa * pt) > Ask)            // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником
      Print("fastMa = ", DoubleToStr(fastMa,Digits));
      Print("i_thresholdFromMa = ", DoubleToStr(i_thresholdFromMa * pt,Digits));
       ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
      Print("OrderOpenPrice() = ", DoubleToStr(OrderOpenPrice(),Digits));
   }
      if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
 
   return (true);
}

Hier ist die Zeile:

ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);

Wir haben eine Position, die zum PreisND(fastMa + i_thresholdFromMa * pt) eröffnet wird, aber dort gar nicht eröffnet. Und warum?

Ich kämpfe jetzt schon seit 2 Tagen und weiß nicht, was ich tun soll. Im Code ist alles gleich geblieben. Ich habe noch keine echten Schecks ausgestellt, ich schreibe sie jetzt für Tester.

Hier ist zum Beispiel ein Bildschirmfoto,

Ein Gelenk

Auf dem Diagramm können Sie sehen, dass der Preis nicht höher als fastMa (rot) ist, und im Allgemeinen niedriger. Im Code ist jedoch ausdrücklich die Bedingung festgelegt, dass der schwebende Auftrag zum Preis erfolgen soll:

ND(fastMa + i_thresholdFromMa * pt)

Wo ist der Haken, Profis? Ich weiß nicht mehr, was ich tun soll...

 

Hallo.Ich habe einen Indikator geschrieben, der auf dem Indikator basiert. Der ursprüngliche Signal-Signal-Indikator zeigt seine Werte auf allen vorherigen Balken an, wenn er an das Diagramm angehängt wird (er wird auf alle Balken angewendet, beginnend mit dem Balken [1]), aber der daraus erstellte Indikator (er wird auf den Balken [0] angewendet) zeigt seine Werte nur an, wenn er an das Diagramm angehängt wird, seine Werte sind korrekt, aber auf den vorherigen Balken "leer", bitte sagen Sie mir, wie ich das beheben kann.

Mein Code:

#property indicator_separate_window
#property indicator_minimum -7
#property indicator_maximum 7
#property indicator_buffers 2
#property indicator_color1 Yellow
#property indicator_color2 DarkOrange
#property indicator_width1  2
#property indicator_width2  2
#property indicator_level1 0.0
//--- buffers
double UpMapBuffer[];
double DnMapBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,UpMapBuffer);
   SetIndexStyle(1,DRAW_HISTOGRAM);
   SetIndexBuffer(1,DnMapBuffer);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int vb;   // внутренний бар
    int i;

    for(i=1;i<Bars-34-1;i++)                                               
     {
      double AO_Sig_Sig_1 = iCustom(NULL,0,"Signal-Signal",0,i);                           
      double AO_Sig_Sig_2 = iCustom(NULL,0,"Signal-Signal",0,i+1);
      
      if((High[i]<=High[i+1])&&(Low[i]>=Low[i+1])&&(AO_Sig_Sig_1==AO_Sig_Sig_2))  vb++;
            
      if((AO_Sig_Sig_1!=AO_Sig_Sig_2)||(i>3+vb)) break;                                                                
     }
         
    i=i*(AO_Sig_Sig_1); 
            
    if(MathAbs(i)>3+vb) i=0;                  

    if(i>0)            
     {
      UpMapBuffer[0]=i;
     }
    else
     {
      UpMapBuffer[0]=0;
     } 
         
    if(i<0)         
     {
      DnMapBuffer[0]=i;
     }
    else
     {
      DnMapBuffer[0]=0;
     }          
                      
//----
   return(0);
  }
//+------------------------------------------------------------------+
 

Victor, ich denke, Sie sollten eine Pause auf Asc + Entfernung, und in der Bedingung angeben, das Verhältnis von Asc und Mashka, dann wird es sein, was Sie wollen. Versuchen Sie es!

 
hoz:


Sie können auf dem Diagramm sehen, dass der Preis nicht über fastMa (das rote Armband) liegt, sondern insgesamt darunter. Im Code ist jedoch ausdrücklich festgelegt, dass die Pause beim Preis liegen muss:

Wo ist der Haken, Profis? Ich weiß nicht mehr, was ich tun soll...

Vielleicht war der MA zu dem Zeitpunkt, als die Bestellung aufgegeben wurde, niedriger als der jetzt gezeichnete Wert. Versuchen Sie, die MAA-Werte nicht vom 0. Takt, sondern vom 1.
 
borilunad:

Victor, ich denke, Sie sollten eine Pause auf Asc + Entfernung, und in der Bedingung angeben, das Verhältnis von Asc und Mashka, dann wird es sein, was Sie wollen. Versuchen Sie es!


Boris, genau das habe ich getan:

//+-------------------------------------------------------------------------------------+
//| Получаем общий сигнал на открытие позиции                                           |
//+-------------------------------------------------------------------------------------+
int GetSignal()
{
   // Получаем значения машек для дальнейших рассчётов
   double fastMa = iMA(NULL,i_TF,i_fastMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
   double slowMa = iMA(NULL,i_TF,i_slowMaPeriod,0,MODE_EMA,MODE_CLOSE,0);
 //  double filtrMa = iMA(NULL,i_TF,i_filtrMaPeriod,0,MODE_SMA,MODE_CLOSE,0);
   
   if (FindOrders() > 0)                                 // Если есть открытые ордера, то..
       return (SIGNAL_NO);                               //..ничего не делаем
   
   if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_UP)      // Если машки указывают вверх
      // if ( (MathAbs(High[0] - fastMa) <= 0.1 * pt ) || ( MathAbs(Low[0] - fastMa) <= 0.1 * pt) )     // Цена вблизи 0.1пп от fastMa
       if ( (MathAbs(Ask - fastMa) <= 0.1 * pt ) || ( MathAbs(Ask - fastMa) <= 0.1 * pt) )
           return(SIGNAL_BUY);      // Функция возвращает сигнал покупки
       
 //  if (GetStateMa(fastMa, slowMa/*, filtrMa*/) == MA_DIRECT_TO_DOWN)
   //    return(SIGNAL_SELL);
   
   return (SIGNAL_NO);
}

Und hier ist die offene Stelle:

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy(double fastMa, double slowMa)
{
   int ticket = -1;
   
       if ((fastMa + i_thresholdFromMa * pt) > Ask)            // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником
      Print("fastMa = ", DoubleToStr(fastMa,Digits));
      Print("i_thresholdFromMa = ", DoubleToStr(i_thresholdFromMa * pt,Digits));
       ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(fastMa + i_thresholdFromMa * pt), 3, 0, 0, NULL, i_magic, 0);
      Print("OrderOpenPrice() = ", DoubleToStr(OrderOpenPrice(),Digits));
      
      if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
 
   return (true);
}

Alles scheint korrekt zu sein. Aber sie ist immer noch da.

Sepulca:
Möglicherweise war der MAHA-Wert zum Zeitpunkt der Bestellung niedriger als der jetzige Wert. Versuchen Sie, die MA-Werte aus dem 1. Takt statt aus dem 0. zu nehmen.


Ausprobiert, kein Unterschied. Ich habe es zurückgelegt... Für mich ist wichtig, was zum jetzigen Zeitpunkt geschieht, und nicht, was vorher geschehen ist.

Hier ist ein Screenshot (wenn der von der Maschine empfangene Wert nicht 0, sondern 1 ist):

Wo ist die Logik?

 

Victor, deshalb schreibe ich am Anfang Bedingungen, damit ich alles sehen kann, damit es einfacher ist, logische Fehler zu finden, vor allem, wenn noch nicht genügend Wissen und Erfahrung vorhanden sind, wozu ich mich noch lange zählen werde. Profis manipulieren Funktionen, Dateien und Bibliotheken mit Leichtigkeit und haben wahrscheinlich vergessen, wie sie sich all dieses Wissen angeeignet haben. Aber wir können die Theorie nicht ohne die Praxis lernen, und viel mehr hängt vom Charakter eines jeden Menschen ab.

 
hoz:


Boris, genau das habe ich getan:

Und hier ist die Stelle zu besetzen:

Alles scheint richtig zu sein. Aber er ist immer noch da.


Ausprobiert, kein Unterschied. Ich ging zurück... Für mich ist wichtig, was zum jetzigen Zeitpunkt geschieht, und nicht, was vorher geschehen ist.

Hier ist ein Screenshot (wenn der von der Maschine empfangene Wert nicht 0, sondern 1 ist):

Sagen Sie mir endlich genau, was Sie tun wollen... Zum Beispiel: MAA so und so steigt und liegt über MAA so und so, und der Preis liegt über/unter MAA so und so, und wenn das stimmt, dann platzieren Sie eine Pending Order in einem Abstand von so und so. Ich werde Ihnen einen groben Algorithmus geben. Denn es ist schwierig, Sie in die richtige Richtung zu lenken, wenn Ihre Codefragmente aus dem Zusammenhang gerissen sind. Und das Problem ist für die fünfte Klasse (übertrieben).


Wie für die hervorgehoben: arbeiten auf offene Preise, dann werden Sie nicht sehen, die MACs neu zeichnen auf der Null-Bar

 
artmedia70:

... ist es schwer, Sie in die richtige Richtung zu lenken...

IMHO nicht schwierig, aber sehr leicht zu "lenken" oder zu senden, denn der Genosse ist zu eifrig in seinem Kampf gegen Tüten und Regale, ohne sich die Mühe zu machen, das Lehrbuch und die Dokumentation zu studieren. :-)

 
Roman.:

IMHO nicht schwierig, aber sehr leicht zu "lenken" oder zu senden, denn der Genosse ist zu eifrig im Kampf gegen Beutel und Regale, nicht die Mühe, das Lehrbuch und Dokumentation zu studieren. :-)

Mann, es gibt praktisch keine Fallstricke ... Es gibt keine Wunder.
Ein Mann hat sich also mit diesen Steinen umgeben und bewegt sie, bewegt sie.
 
Sepulca:


Vielen Dank. Das ist genau das, was wir brauchen.)
Grund der Beschwerde: