[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 335

 
borilunad:
Allora fai qualche ricerca a casa tua! Avete una funzione per ogni parola del vostro codice, e dovete accontentarvi delle variabili. È questo che rende il codice pesante. Dovresti usare le funzioni quando non puoi farne a meno! Ho commentato tutto nel codice di Kim che non mi serve, e funziona tutto molto velocemente! Ricordate, ho chiesto a tutti come rendere il programma più veloce in molte condizioni. Ora il test funziona per un anno su tutte le zecche in 5 minuti! Ho passato al setaccio tutte le condizioni e le funzioni e ho buttato via tutto ciò che non era necessario.

Certo che mi ricordo. Continuerò a farlo per un po'. In effetti, ho bisogno di cambiare le mie abitudini. Non è il primo programmatore a dire che il mio codice non è facile da capire. A quanto pare lo è...
 
borilunad:
Quindi scava nel tuo posto! Avete una funzione per ogni parola del vostro codice, e dovete accontentarvi delle variabili. Ecco perché il tuo codice è pesante. Dovresti usare le funzioni quando non puoi farne a meno! Ho commentato tutto quello che non mi serve nel codice di Kim, e funziona tutto molto velocemente! Ricordate, ho chiesto a tutti come rendere il programma più veloce in molte condizioni. Ora il test funziona per un anno su tutte le zecche in 5 minuti! Ho passato al setaccio tutte le condizioni e le funzioni e ho buttato via tutto ciò che non era necessario.

Si può fare a meno delle variabili solo se testiamo la strategia nel tester.

Per il reale, ogni valore necessario per eseguire la logica deve essere calcolato al momento giusto, perché i valori di queste variabili sono molto facili da perdere, per esempio durante un riavvio.

 

Buona giornata a tutti voi.

Ho già capito come scrivere gli indici, ma ho problemi con il primo robot. Sembra essere logico, il compilatore non si lamenta, il giornale non ha errori, ma l'Expert Advisor nel tester non funziona - il grafico si apre, ma non c'è movimento su questo grafico (il grafico non si muove).

L'idea è la seguente: L'indicatore produce un punto (sempre all'apertura e al prezzo di apertura della candela) da cui comprare o vendere, il compito del robot allo stesso tempo, dopo aver ricevuto un punto per comprare o vendere, chiudere l'ordine opposto, aprire un nuovo o modificare un vecchio ordine nella stessa direzione (stop e TP sono emessi da un altro indicatore)

Vi sarei molto grato se mi diceste dove è sbagliato.

Il codice stesso (cambiato i nomi degli indici secondo la loro funzionalità, rimosso la dichiarazione delle variabili e la sezione di gestione degli errori):

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

   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);

L'essenza del problema è la seguente: non è chiaro cosa mettere tra parentesi graffe nel corpo degli operatori #1,2 infatti viene verificato il rispetto delle condizioni di trading e non ci sono più azioni.

(Ci sono quattro segnali di trading, il numero 1 si innesca, passiamo il controllo al segnale di elaborazione numero 2, il numero 2 si innesca, lo passiamo ai segnali di elaborazione numero 3 e 4 e lì eseguiamo le operazioni di trading).

  else
         return(0);

Vale la pena aggiungerlo alla fine? Logicamente, se i segnali #3,4 non scattano, allora ho bisogno che l'Expert Advisor riparta.

 
artmedia70:

Levariabili possono essere utilizzate solo quando si testa la strategia nel tester.

Per il mondo reale, ogni valore necessario per eseguire la logica deve essere calcolato al momento giusto, perché i valori di queste variabili sono molto facili da perdere, per esempio durante un riavvio.

Ma le variabili scritte nell'extern si perdono? Non è mai successo! Ma tutte le condizioni sono davanti agli occhi e a portata di mano in start(), e le funzioni, che sono fuori da start(), hanno controlli e azioni finali non modificabili! Potrei sbagliarmi di grosso, ma finora mi trovo bene così, e non ho ancora ricevuto un solo errore o rakeback su Real! Leggo sempre con attenzione i tuoi post, Artem, e altri programmatori esperti come alsu, Meat e altri, così come i moderatori ospiti! Ma non tutto è ancora nelle mie capacità, quindi non posso applicare ciò che non mi è ancora chiaro nei minimi dettagli. grazie di tutto!
 
barma:

Buona giornata a tutti voi.

Ho già capito come scrivere gli indici, ma ho problemi con il primo robot. Sembra essere logico, il compilatore non si lamenta, il giornale non ha errori, ma l'Expert Advisor nel tester non funziona - il grafico si apre, ma non c'è movimento su questo grafico (il grafico non si muove).

L'idea è la seguente: L'indicatore produce un punto (sempre all'apertura e al prezzo di apertura della candela) da cui comprare o vendere, il compito del robot allo stesso tempo, dopo aver ricevuto un punto per comprare o vendere, chiudere l'ordine opposto, aprire un nuovo o modificare un vecchio ordine nella stessa direzione (stop e TP sono emessi da un altro indicatore)

Vi sarei molto grato se mi diceste dove è sbagliato.

Il codice stesso (cambiato i nomi degli indici secondo la loro funzionalità, rimosso la dichiarazione delle variabili e la sezione di gestione degli errori):

Se avete sostituito i nomi degli indicatori solo nell'EA, e non anche nei codici degli indicatori stessi, che vengono visualizzati nelle finestre corrispondenti sui grafici, allora l'EA non riceverà nulla da loro, e l'errore non viene dato, perché tutto viene presentato nell'EA, ma non riceve segnali dagli indicatori. Controlla se i nomi degli indicatori sono scritti allo stesso modo negli indicatori stessi!
 
borilunad:
Se avete cambiato i nomi degli indicatori solo nell'EA, e non nei codici degli indicatori stessi, che sono visualizzati nelle finestre corrispondenti sui grafici, allora l'EA non riceverà nulla da loro e non darà un errore, perché tutto è presentato nell'EA, ma non riceve segnali dagli indicatori. Controlla se i nomi degli indicatori sono scritti allo stesso modo!

Grazie per il suggerimento, ho controllato tutto ancora una volta, non ci sono errori nella scrittura. Ho solo cambiato i nomi degli indicatori nel testo del primo messaggio sul forum, per rendere chiaro il loro compito, nel testo dell'Expert Advisor i nomi degli indici sono scritti esattamente come sono nominati nella cartella "indicators". Per esempio: "3.0_figuri_2.3_rasshirenie".

Inoltre, ho selezionato un altro EA (dal tutorial) e ho inserito i nomi di indicatori non esistenti nella funzione iCustom. Quello che è successo è il seguente: l'EA ha davvero smesso di fare trading (il che è, tra l'altro, comprensibile), ma quando avvio il tester, il grafico si muove dalla data di inizio impostata alla data di fine impostata, devo ricordarvi che il mio problema è che il grafico non si muove.

Forse qualcun altro ha affrontato questo problema?

 
barma:

Grazie per il suggerimento, ho controllato tutto ancora una volta, non ci sono errori nella scrittura. Ho solo cambiato i nomi degli indicatori nel testo del primo messaggio sul forum, per rendere chiaro il loro compito, nel testo dell'Expert Advisor i nomi degli indici sono scritti esattamente come sono nominati nella cartella "indicators". Per esempio: "3.0_figuri_2.3_rasshirenie".

Inoltre, ho selezionato un altro EA (dal tutorial) e ho inserito i nomi di indicatori non esistenti nella funzione iCustom. Quello che è successo è stato il seguente - l'EA ha davvero smesso di fare trading (il che è, tra l'altro, comprensibile), ma quando avvio il tester, il grafico si muove dalla data di inizio impostata alla data di fine impostata, devo ricordare che il problema è che il grafico non si muove.

Forse qualcun altro ha avuto un problema simile.

Controlla il nome dell'indicatore, non nella cartella, ma nel suo codice: "short name", perché da esso l'Expert Advisor lo riconosce, se è ancora installato sul grafico appropriato e sul TF!
 
Perché l'indicatore disegni qualcosa nel tester, deve essere installato sul grafico, l'EA stesso non disegnerà linee.
 
barma:

Grazie per il suggerimento, ho controllato tutto ancora una volta, non ci sono errori nella scrittura. Ho solo cambiato i nomi degli indicatori nel testo del primo messaggio sul forum, per rendere chiaro il loro compito, nel testo dell'Expert Advisor i nomi degli indici sono scritti esattamente come sono nominati nella cartella "indicators". Per esempio: "3.0_figuri_2.3_rasshirenie".

Inoltre, ho selezionato un altro EA (dal tutorial) e ho inserito i nomi di indicatori non esistenti nella funzione iCustom. Quello che è successo è stato il seguente: l'EA ha davvero smesso di fare trading (il che è, tra l'altro, comprensibile), ma quando avvio il tester, il grafico si muove dalla data di inizio impostata alla data di fine impostata, devo ricordare che il problema è che il grafico non si muove.

Forse qualcun altro ha avuto un problema simile?

Fine settimana negli uffici, quindi il grafico non si muove.
Motivazione: