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

 
borilunad:
Dann graben Sie in Ihrer eigenen Wohnung! Sie haben für jedes Wort Ihres Codes eine Funktion, und Sie müssen mit Variablen auskommen. Das macht den Code schwerfällig. Ich habe in Kims Code alles auskommentiert, was ich nicht brauche, und es funktioniert alles sehr schnell! Erinnern Sie sich daran, dass ich jeden gefragt habe, wie man das Programm unter vielen Bedingungen schneller laufen lassen kann. Jetzt laufen die Tests für ein Jahr auf allen Zecken in 5 Minuten! Ich bin alle Bedingungen und Funktionen durchgegangen und habe alles Unnötige entfernt.

Natürlich erinnere ich mich. Ich werde noch eine Weile so weitermachen. In der Tat muss ich meine Gewohnheiten ändern. Es ist nicht der erste Programmierer, der sagt, dass mein Code nicht leicht zu verstehen ist. Offensichtlich ist es so...
 
borilunad:
Also graben Sie an Ihrem eigenen Platz! Sie haben für jedes Wort Ihres Codes eine Funktion, und Sie müssen mit Variablen aus kommen. Deshalb ist Ihr Code so schwerfällig. Ich habe alles, was ich in Kims Code nicht brauche, auskommentiert, und es funktioniert alles sehr schnell! Erinnern Sie sich daran, dass ich jeden gefragt habe, wie man das Programm unter vielen Bedingungen schneller laufen lassen kann. Jetzt läuft die Prüfung für ein Jahr auf alle Zecken in 5 Minuten! Ich bin alle Bedingungen und Funktionen durchgegangen und habe alles Unnötige entfernt.

Auf Variablen kann nur verzichtet werden, wenn wir die Strategie im Tester testen.

In der Realität muss jeder Wert, der für die Ausführung der Logik benötigt wird, zum richtigen Zeitpunkt berechnet werden, da die Werte dieser Variablen sehr leicht verloren gehen können, z. B. bei Neustarts.

 

Ich wünsche Ihnen allen einen guten Tag.

Ich habe bereits herausgefunden, wie man Indizes schreibt, aber ich habe Probleme mit dem ersten Roboter. Es scheint logisch zu sein, der Compiler beschwert sich nicht, das Journal hat keine Fehler, aber der Expert Advisor im Tester funktioniert nicht - der Chart öffnet sich, aber es gibt keine Bewegung auf diesem Diagramm (der Chart bewegt sich nicht).

Die Idee ist die folgende: Der Indikator erzeugt einen Punkt (immer bei der Eröffnung und dem Eröffnungskurs der Kerze), von dem aus zu kaufen oder zu verkaufen, die Aufgabe des Roboters zur gleichen Zeit, nach Erhalt eines Punktes zu kaufen oder zu verkaufen, schließen Sie die entgegengesetzte Bestellung, öffnen Sie eine neue oder ändern Sie eine alte Bestellung in die gleiche Richtung (Stops und TP werden von einem anderen Indikator ausgegeben)

Für Hinweise, wo es falsch ist, wäre ich Ihnen sehr dankbar.

Der Code selbst (die Namen der Indizes wurden entsprechend ihrer Funktionalität geändert, die Deklaration der Variablen und der Abschnitt zur Fehlerbehandlung wurden entfernt):

   // Предварит.обработка

   if(High[0]!=Low[0]) return; //если бар открылся до поступления текущей котировки, выход из start

       vverh = iCustom(NULL,0,"Индикатор дающий точку на покупку",Glubina,Pogreshnost,0,0);   //значение индикатора на покупку
       vniz  = iCustom(NULL,0,"Индикатор дающий точку на продажу",Glubina,Pogreshnost,1,0);   //значение индикатора на продажу
       
   if(vverh==0 && vniz==0)
     {
      Alert("Сигнала нет. Эксперт ждёт сигнал.");
      return;
     }
   if(Bars < Glubina)                       // Недостаточно баров
     {
      Alert("Недостаточно баров в окне. Эксперт не работает.");
      return;                                   // Выход из start()
     }
   if(Work==false)                              // Критическая ошибка
     {
      Alert("Критическая ошибка. Эксперт не работает.");
      return;                                   // Выход из start()
     }

//--------------------------------------------------------------- 4 --
   // Учёт ордеров
   Symb=Symbol();                               // Название фин.инстр.
   Total=0;                                     // Количество ордеров
   for(i=1; i<=OrdersTotal(); i++)              // Цикл перебора ордеров
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм
         if (OrderMagicNumber()!=MagicNumber)   // Попался ордер открытый не советником
            continue;
            
         Total++;                               // Счётчик ордеров открытых советником
         if (Total>1)                           // Не более одного орд
           {
            Alert("Несколько ордеров одного советника. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Ticket=OrderTicket();                  // Номер выбранн. орд.
         Tip   =OrderType();                    // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                // SL выбранного орд.
         TP    =OrderTakeProfit();              // TP выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
        }
     }
//--------------------------------------------------------------- 5 --
// торговые критерии
if(vverh>0)
  {
   Opn_B=true;
   Cls_S=true;
   Opn_S=false;
   Cls_B=false;
  }
if(vverh>0)
  {
   Opn_S=true;
   Cls_B=true;
   Opn_B=false;
   Cls_S=false;
  }
  
//--------------------------------------------------------------- 6 --
   
   //расчет стопов
   i_stop=0;
   while (stopov_for_S<2)                                                        //ищем 2 последних точки стопа в индикаторе, выбираем изз них самую дальнюю от текущей цены
         {
          for_S = iCustom(NULL,0,"Индюк дающий точки стопов",Glubina,0,i_stop);
          if (for_S>0)
             {
              stopov_for_S++;
              if(Stop_for_S<for_S) Stop_for_S=for_S;
             }
          i_stop++;
         }
   i_stop=0;
   while (stopov_for_B<2)
         {
          for_B = iCustom(NULL,0,"Индюк дающий точки стопов",Glubina,1,i_stop);
          if (for_B>0)
             {
              stopov_for_B++;
              if(Stop_for_B<for_B) Stop_for_B=for_B;
             }
          i_stop++;
         }
SL_for_B = Stop_for_B-pogreshnostSL;
SL_for_S = Stop_for_S+pogreshnostSL;
TP_for_B=vverh+(vverh-Stop_for_B)*koeff_dvizheniya;
TP_for_S=vniz-(Stop_for_S-vniz)*koeff_dvizheniya;


   // Закрытие и модификация ордеров
   while(true)                                  // Цикл закрытия и модификации орд.
     {
      if (Tip==0 && Opn_B==true)                // Если открыт ордер БАЙ и индикатор дает сигнал на покупку
             {
              OrderModify(Ticket,SL_for_B,TP_for_B,0,CLR_NONE); //меняем стопы текущего ордера бай
              break;
             }
      if (Tip==0 && Opn_S==true)                // Если открыт ордер БАЙ и индикатор дает сигнал на продажу
             {
              RefreshRates();
              Ans=OrderClose(Ticket,Lot,Bid,50);        // закрываем БАЙ
                 if (Ans==true)                         // Получилось :)
                    {
                     Alert ("Закрыт ордер Buy ",Ticket);
                     break;                             // Выход из цикла закр
                    }
                 if (Fun_Error(GetLastError())==1)      // Обработка ошибок
                     continue;                          // Повторная попытка
             }
      
      if (Tip==1 && Opn_S==true)
             {
              OrderModify(Ticket,SL_for_S,TP_for_S,0,CLR_NONE);
              break;
             }
      if (Tip==1 && Opn_B==true)
             {
              RefreshRates();
              Ans=OrderClose(Ticket,Lot,Ask,50);
                 if (Ans==true)                         // Получилось :)
                    {
                     Alert ("Закрыт ордер Sell ",Ticket);
                     break;                             // Выход из цикла закр
                    }
                 if (Fun_Error(GetLastError())==1)      // Обработка ошибок
                     continue;                          // Повторная попытка
             }
     }
//--------------------------------------------------------------- 7 --
   // Стоимость ордеров
   RefreshRates();                              // Обновление данных
   Min_Lot=MarketInfo(Symb,MODE_MINLOT);        // Миним. колич. лотов 
   Free   =AccountFreeMargin();                 // Свободн средства
   One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
   Step   =MarketInfo(Symb,MODE_LOTSTEP);       // Шаг изменен размера

   if (Lots > 0)                                // Если заданы лоты,то 
      Lts =Lots;                                // с ними и работаем 
   else                                         // % свободных средств
      Lts=MathFloor(Free*Prots/One_Lot/Step )*Step;// Для открытия

   if(Lts < Min_Lot) Lts=Min_Lot;               // Не меньше минимальн
   if (Lts*One_Lot > Free)                      // Лот дороже свободн.
     {
      Alert(" Не хватает денег на ", Lts," лотов");
      return;                                   // Выход из start()
     }
//--------------------------------------------------------------- 8 --
   // Открытие ордеров
   while(true)                                  // Цикл закрытия орд.
     {
      Ticket=0;
      if (Opn_B==true)                          // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         Alert("Попытка открыть Buy. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,50,SL_for_B,TP_for_B,"My order #",MagicNumber,0,CLR_NONE);//Открытие Buy
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                            // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
        
      if (Opn_S==true)                          // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                        // Обновление данных
         Alert("Попытка открыть Sell. Ожидание ответа..");
         Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,50,SL_for_S,TP_for_S,"My order #",MagicNumber,0,CLR_NONE);//Открытие Sell
         if (Ticket > 0)                        // Получилось :)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return;                            // Выход из start()
           }
         if (Fun_Error(GetLastError())==1)      // Обработка ошибок
            continue;                           // Повторная попытка
         return;                                // Выход из start()
        }
     }
//--------------------------------------------------------------- 9 --
   return;                                      // Выход из start()
  }

 
If (торговые условия сигнал №1)
  {
  }//   Какой код нужен, чтобы тело оператора №1 в случае соответствия, передало управление к оператору  «торговых       условий №2»    

If (торговые условия сигнал №2)
  {
  }// Какой код нужен, чтобы тело оператора №2 в случае соответствия, передало управление к оператору «торговых       условий №3 и №4»    

If (торговые условия сигнал №3)
  {                                          
   Opn_B=true;                            
   }
   else
If (торговые условия сигнал №4)
  {                                          
   Opn_S=true;                            
   }
     else
         return(0);

Das Problem stellt sich im Wesentlichen wie folgt dar: Es ist nicht klar, was in den geschweiften Klammern im Text der Operatoren 1 und 2 stehen soll, denn es wird die Einhaltung der Handelsbedingungen überprüft und es gibt keine weiteren Aktionen.

(Es gibt vier Handelssignale, Nummer 1 löst aus, wir geben die Kontrolle an das Verarbeitungssignal Nummer 2 weiter, Nummer 2 löst aus, wir geben sie an die Verarbeitungssignale Nummer 3 und 4 weiter und führen dort Handelsoperationen durch).

  else
         return(0);

Lohnt es sich, sie am Ende hinzuzufügen? Wenn die Signale 3 und 4 nicht ausgelöst werden, muss ich logischerweise den Expert Advisor neu starten.

 
artmedia70:

Variablen können nur beim Testen der Strategie im Tester verwendet werden.

In der realen Welt muss jeder Wert, der für die Ausführung der Logik benötigt wird, zum richtigen Zeitpunkt berechnet werden, da die Werte dieser Variablen sehr leicht verloren gehen können, zum Beispiel bei einem Neustart.

Aber gehen die Variablen, die im Extern geschrieben werden, verloren? Das ist noch nie passiert! Aber alle Bedingungen sind vor meinen Augen und zur Hand in start(), und Funktionen, die außerhalb von start() sind, haben Prüfungen und endgültige nicht veränderbare Aktionen! Vielleicht liege ich im Großen und Ganzen falsch, aber bis jetzt fühle ich mich auf diese Weise wohl, und ich habe noch keinen einzigen Fehler oder Rakeback auf Real bekommen! Ich lese deine Beiträge immer aufmerksam, Artem, und andere erfahrene Programmierer wie alsu, Meat und andere, sowie Gastmoderatoren! Aber noch liegt nicht alles in meinen Möglichkeiten, so dass ich das, was mir noch nicht bis ins kleinste Detail klar ist, nicht anwenden kann. danke für alles!
 
barma:

Ich wünsche Ihnen allen einen guten Tag.

Ich habe bereits herausgefunden, wie man Indizes schreibt, aber ich habe Probleme mit dem ersten Roboter. Es scheint logisch zu sein, der Compiler beschwert sich nicht, das Journal hat keine Fehler, aber der Expert Advisor im Tester funktioniert nicht - der Chart öffnet sich, aber es gibt keine Bewegung auf diesem Diagramm (der Chart bewegt sich nicht).

Die Idee ist die folgende: Der Indikator erzeugt einen Punkt (immer bei der Eröffnung und dem Eröffnungskurs der Kerze), von dem aus zu kaufen oder zu verkaufen, die Aufgabe des Roboters zur gleichen Zeit, nach Erhalt eines Punktes zu kaufen oder zu verkaufen, schließen Sie die entgegengesetzte Bestellung, öffnen Sie eine neue oder ändern Sie eine alte Bestellung in die gleiche Richtung (Stops und TP werden von einem anderen Indikator ausgegeben)

Für Hinweise, wo es falsch ist, wäre ich Ihnen sehr dankbar.

Der Code selbst (die Namen der Indizes wurden entsprechend ihrer Funktionalität geändert, die Deklaration der Variablen und der Abschnitt zur Fehlerbehandlung wurden entfernt):

Wenn Sie die Namen der Indikatoren nur im EA und nicht auch in den Indikatorcodes selbst ersetzt haben, die in den entsprechenden Fenstern auf den Charts angezeigt werden, dann empfängt der EA nichts von ihnen, und der Fehler wird nicht angezeigt, weil alles im EA angezeigt wird, aber er empfängt keine Signale von den Indikatoren. Prüfen Sie, ob die Namen der Indikatoren gleich geschrieben werden!
 
borilunad:
Wenn Sie die Namen der Indikatoren nur im EA geändert haben und nicht in den Codes der Indikatoren selbst, die in den entsprechenden Fenstern auf den Charts angezeigt werden, dann empfängt der EA nichts von ihnen und gibt keinen Fehler aus, weil alles im EA dargestellt wird, aber er empfängt keine Signale von Indikatoren. Prüfen Sie, ob die Namen der Indikatoren gleich geschrieben werden!

Danke für den Hinweis, ich habe alles noch einmal überprüft, es sind keine Fehler in der Schrift. Ich habe nur die Namen der Indikatoren im Text der ersten Nachricht im Forum geändert, um ihre Aufgabe zu verdeutlichen, im Text des Expert Advisors werden die Namen der Indizes genau so geschrieben, wie sie im Ordner "Indikatoren" benannt sind. Zum Beispiel: "3.0_figuri_2.3_rasshirenie".

Außerdem habe ich einen anderen EA (aus dem Tutorial) ausgewählt und die Namen von nicht vorhandenen Indikatoren in die iCustom-Funktion eingegeben. Was geschah, war das folgende - die EA wirklich gestoppt Handel (was übrigens verständlich ist), aber wenn ich den Tester zu starten, das Diagramm wurde von der eingestellten Startdatum auf die eingestellte Enddatum bewegen, sollte ich Sie daran erinnern, dass mein Problem ist, dass das Diagramm nicht bewegt wird.

Vielleicht hat jemand anderes dieses Problem schon einmal gehabt?

 
barma:

Danke für den Hinweis, ich habe alles noch einmal überprüft, es sind keine Fehler in der Schrift. Ich habe nur die Namen der Indikatoren im Text der ersten Nachricht im Forum geändert, um ihre Aufgabe zu verdeutlichen, im Text des Expert Advisors werden die Namen der Indizes genau so geschrieben, wie sie im Ordner "Indikatoren" benannt sind. Zum Beispiel: "3.0_figuri_2.3_rasshirenie".

Außerdem habe ich einen anderen EA (aus dem Tutorial) ausgewählt und die Namen von nicht vorhandenen Indikatoren in die iCustom-Funktion eingegeben. Was geschah, war das folgende - die EA wirklich gestoppt Handel (was übrigens verständlich ist), aber wenn ich den Tester zu starten, das Diagramm wurde von der eingestellten Startdatum zum eingestellten Enddatum bewegen, sollte ich daran erinnern, dass das Problem ist, dass das Diagramm nicht bewegen.

Vielleicht hatte jemand anderes ein solches Problem.

Prüfen Sie den Namen des Indikators, nicht im Ordner, sondern in seinem Code: "Kurzname", denn daran erkennt der Expert Advisor ihn, wenn er noch auf dem entsprechenden Chart und der TF installiert ist!
 
Damit der Indikator im Tester etwas zeichnen kann, muss er auf dem Chart installiert sein, der EA selbst zeichnet keine Linien.
 
barma:

Danke für den Hinweis, ich habe alles noch einmal überprüft, es sind keine Fehler in der Schrift. Ich habe nur die Namen der Indikatoren im Text der ersten Nachricht im Forum geändert, um ihre Aufgabe zu verdeutlichen, im Text des Expert Advisors werden die Namen der Indizes genau so geschrieben, wie sie im Ordner "Indikatoren" benannt sind. Zum Beispiel: "3.0_figuri_2.3_rasshirenie".

Außerdem habe ich einen anderen EA (aus dem Tutorial) ausgewählt und die Namen von nicht vorhandenen Indikatoren in die iCustom-Funktion eingegeben. Was geschah, war das folgende - die EA wirklich gestoppt Handel (was übrigens verständlich ist), aber wenn ich den Tester zu starten, das Diagramm wurde von der eingestellten Startdatum auf die eingestellte Enddatum bewegen, sollte ich Sie daran erinnern, dass das Problem ist, dass das Diagramm nicht bewegen.

Vielleicht hatte jemand anderes ein solches Problem?

Wochenende in den Büros, so dass sich die Grafik nicht bewegt.