Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 412

 
Ekburg:

Accidenti... Sono certamente contento che hai iniziato a risolvere il problema, ma il mio messaggio che in qualche modo non hai notato, dove ho detto la stessa cosa, un po 'di parole diverse, e subito detto le carenze, tranne che per la chiusura del file, non subito visto dove hai succede:)

Hai scritto una risposta in tre punti. Nel primo hai fatto un errore (la mia voce è abbastanza corretta), nel secondo hai anche fatto un errore (anche se questo messaggio l'ha livellato :) Il terzo punto suonava come se tu suggerissi di spostare il cursore alla fine dopo la voce, non prima (che è stato preso di nuovo come un errore). Di fronte a una tale immagine, ho preferito fare un chiarimento da un moderatore molto esperto che mi ha risposto.

Tuttavia, grazie davvero per il vostro feedback. E un felice anno nuovo! :)

 

Salve. Di fronte a una situazione spiacevole. Aiutami.

Ho un Expert Advisor. Funziona bene nello Strategy Tester, non ho reclami. Quando lo eseguo su una demo, l'Expert Advisor non può piazzare stop su certi ordini. C'è un errore che appare non sempre, ma a volte. Sono disperato di trovarlo da solo e spero di ricevere il vostro aiuto. Va notato che l'EA funziona perfettamente in tutti gli altri aspetti, proprio come nel tester, nessuna lamentela, tranne che il problema è che gli stop non sono sempre impostati. L'errore appare in diversi broker su diversi conti. Ecco la parte del codice responsabile delle operazioni commerciali

ord_ticket=OrderSend(ASymb,ord_type,ord_lots,ord_openpr,20,0,0,"",ord_magic);
if(ord_ticket>0) {
  //---- обновление инфы
  OrderSelect(ord_ticket,SELECT_BY_TICKET);
  ord_openpr=OrderOpenPrice();
  ZigZagInfo[0][ZZ_TimeP]=t_cur;
  ZigZagInfo[k][ZZ_TryCount]++;
  //---- проверка стопов
  if(ND(a*(ord_tp-ord_openpr)-stops,Digits)<0) ord_tp=ND(ord_openpr+a*stops,Digits); 
  if(ND(a*(ord_openpr-ord_sl)-stops,Digits)<0) ord_sl=ND(ord_openpr-a*stops,Digits);
  //---- время удаления
  if(TimeDelete>0) td=TimeCurrent()+60*TimeDelete;
  else td=0;
  //----
  if(!OrderModify(ord_ticket,ord_openpr,ord_sl,ord_tp,td)) {
    Alert(Error(GetLastError()),"/nSL=",DoubleToStr(ord_sl,5)," TP=",DoubleToStr(ord_tp,5),"/nTimeDel=",TimeToStr(td),
          "OP=",DoubleToStr(ord_openpr,5));
  }
}

Ecco il codice della funzione Error(int er)

string Error(int er) {
  switch(er) {
    case 0:   return("Нет ошибки");
    case 1:   return("Нет ошибки, но результат неизвестен");
    case 2:   return("Общая ошибка(сбой системы, глюк, и т.п.)");
    case 3:   return("Неправильные параметры");
    case 4:   return("Торговый сервер занят");
    case 6:   return("Нет связи с торговым сервером");
    case 7:   return("Недостаточно прав");
    case 8:   return("Слишком частые запросы");
    case 9:   return("Недопустимая операция нарушающая функционирование сервера");
    case 128: return("Истек срок ожидания совершения сделки");
    case 129: return("Неправильная цена");
    case 130: return("Неправильные стопы");
    case 131: return("Неправильный объем");
    case 133: return("Торговля запрещена");
    case 134: return("Недостаточно денег для совершения операции");
    case 135: return("Цена изменилась");
    case 137: return("Брокер занят");
    case 138: return("Новые цены");
    case 139: return("Ордер заблокирован и уже обрабатывается");
    case 140: return("Разрешена только покупка");
    case 141: return("Слишком много запросов");
    case 145: return("Модификация запрещена, так как ордер слишком близок к рынку");
    case 146: return("Подсистема торговли занята");
    case 147: return("Использование даты истечения ордера запрещено брокером");
    case 148: return("Количество открытых и отложенных ордеров достигло предела, установленного брокером");
    case 149: return("Попытка открыть противоположную позицию к уже существующей в случае, если хеджирование запрещено.");
    default:  return("Неизвестная ошибка "+DoubleToStr(er,0));
  }
}

Così, quando l'EA non riesce a impostare gli stop, appare un messaggio che mostra le informazioni sull'errore e i parametri dell'ordine che ha cercato di modificare. Quello che scrive è il vero mistero per me. Come potete vedere dalle immagini qui sotto, scrive costantemente che il volume è sbagliato. Questo è strano. Dovrei aggiungere che tutti i parametri dell'ordine sono calcolati correttamente prima della modifica, si può vedere nei messaggi. Altrimenti l'errore sarebbe diverso. Il programma è stato testato con uno spread superiore a quello della demo.

Enigmaun altro

 
_Vladimir_:

Salve. Di fronte a una situazione spiacevole. Aiutami.

Ho un Expert Advisor. Funziona bene nello Strategy Tester, non ho reclami. Tuttavia, quando lo eseguo su una demo, vedo che l'EA non può piazzare stop su certi ordini. C'è un errore che appare non sempre, ma a volte. Sono disperato di trovarlo da solo e spero di ricevere il vostro aiuto. Va notato che l'EA funziona perfettamente in tutti gli altri aspetti, proprio come nel tester, nessuna lamentela, tranne che il problema è che gli stop non sono sempre impostati. L'errore appare in diversi broker su diversi conti. Ecco la parte del codice responsabile delle operazioni commerciali

Ecco il codice della funzione Error(int er)

Così, quando l'EA non riesce a impostare gli stop, appare un messaggio che mostra le informazioni sull'errore e i parametri dell'ordine che ha cercato di modificare. Quello che scrive è il vero mistero per me. Come potete vedere dalle immagini qui sotto, scrive costantemente che il volume è sbagliato. Questo è strano. Dovrei aggiungere che tutti i parametri dell'ordine sono calcolati correttamente prima della modifica, si può vedere nei messaggi. Altrimenti l'errore sarebbe diverso. Il programma è stato testato con uno spread superiore a quello della demo.

Fate attenzione ai valori delle vostre variabili globali. Posso supporre che ord_ticket sia una variabile globale, il che significa che il valore precedente può essere memorizzato in essa. E prima di chiamare GetLastError() per catturare l'errore, si dovrebbe resettare il valore precedente chiamandolo all'inizio del codice.
 
TarasBY:
Dovreste stare molto attenti ai valori delle vostre variabili globali. Posso suggerire che ord_ticket è una variabile globale e quindi può memorizzare il valore precedente. E prima di chiamare GetLastError() per catturare l'errore, si dovrebbe resettare il valore precedente chiamandolo all'inizio del codice.

ord_ticket è dichiarato a livello locale. E poi anche se è dichiarato globalmente nella prima riga

ord_ticket=OrderSend(ASymb,ord_type,ord_lots,ord_openpr,20,0,0,"",ord_magic);
if(ord_ticket>0) {

il suo valore cambierà certamente. Sarà o il numero d'ordine in caso di transazione riuscita, o -1 altrimenti. Quindi, se l'ordine non viene aperto, non arriviamo al blocco di impostazione degli stop.

Bisogna anche notare che la funzione OrderSend() cambia sempre il valore dell'ultimo errore(secondo la documentazione e la logica), quindi resettare la lettura precedente in questo caso non è necessario e risulterebbe in una semplice perdita di tempo. Cioè, l'errore 131 appare dopo essere entrati nel blocco di impostazione dell'arresto e prima che venga visualizzato il messaggio di errore. Dato che gli stop non sono realmente posizionati, la funzione OrderModify() deve essere l'ultima funzione ad essere chiamata, la quale, così come la precedente, cambia sempre il valore dell'ultimo errore. Ma non riesco a capire perché non cambia il valore dell'ultimo errore. Da dove viene? Ancora una volta dirò che non ci sono stati problemi nel tester.

Ho avuto l'idea che il broker stesse imbrogliando perché il server inviava i numeri di errore al terminale e quest'ultimo a sua volta li inviava all'Expert Advisor. Ho abbandonato questa idea perché solo gli ordini di un EA hanno errori, altri EA che lavorano in parallelo non hanno tali errori.

 
_Vladimir_:

ord_ticket è dichiarato a livello locale. E poi anche se è dichiarato globalmente nella prima riga

il suo valore cambierà certamente. Sarà o il numero d'ordine in caso di transazione riuscita, o -1 altrimenti. Quindi, se l'ordine non viene aperto, non arriviamo al blocco di impostazione degli stop.

Bisogna anche notare che la funzione OrderSend() cambia sempre il valore dell'ultimo errore (secondo la documentazione e la logica), quindi resettare la lettura precedente in questo caso non è necessario e risulterebbe in una semplice perdita di tempo. Cioè, l'errore 131 appare dopo essere entrati nel blocco di impostazione dell'arresto e prima che venga visualizzato il messaggio di errore. Dato che gli stop non sono realmente posizionati, la funzione OrderModify() deve essere l'ultima funzione ad essere chiamata, la quale, così come la precedente, cambia sempre il valore dell'ultimo errore. Ma non riesco a capire perché non cambia il valore dell'ultimo errore. Da dove viene? Ancora una volta dirò che non ci sono stati problemi nel tester.

Ho avuto l'idea che il broker stesse imbrogliando perché il server inviava i numeri di errore al terminale e quest'ultimo a sua volta li inviava all'Expert Advisor. Ho rapidamente abbandonato questa idea perché solo gli ordini di un EA hanno errori, altri EA che lavorano in parallelo non hanno tali errori.


Aggiungo. Il codice dell'EA che lavora in parallelo è esattamente lo stesso, è responsabile dell'impostazione degli stop. Questo EA non ha mai avuto una situazione in cui gli stop non sono stati impostati per gli ordini.

Sembra che ci sia un errore nel calcolo dei parametri da qualche parte sopra, ma se solo un parametro è sbagliato, dovrebbe apparire un altro errore. Per esempio, il noto 130

 
_Vladimir_:

ord_ticket è dichiarato a livello locale. E poi anche se è dichiarato globalmente nella prima riga

il suo valore cambierà certamente. Sarà o il numero d'ordine in caso di transazione riuscita, o -1 altrimenti. Quindi, se l'ordine non viene aperto, non arriviamo al blocco di impostazione degli stop.

Bisogna anche notare che la funzione OrderSend() cambia sempre il valore dell'ultimo errore (secondo la documentazione e la logica), quindi resettare la lettura precedente in questo caso non è necessario e risulterebbe in una semplice perdita di tempo. Cioè, l'errore 131 appare dopo essere entrati nel blocco di impostazione dell'arresto e prima che venga visualizzato il messaggio di errore. Dato che gli stop non sono realmente posizionati, la funzione OrderModify() deve essere l'ultima funzione ad essere chiamata, la quale, così come la precedente, cambia sempre il valore dell'ultimo errore. Ma non riesco a capire perché non cambia il valore dell'ultimo errore. Da dove viene? Ancora una volta dirò che non ci sono stati problemi nel tester.

Ho avuto l'idea che il broker stesse imbrogliando perché il server inviava i numeri di errore al terminale e quest'ultimo a sua volta li inviava all'Expert Advisor. Ho rapidamente abbandonato questa idea perché solo gli ordini di un EA hanno questi problemi, altri EA che lavorano in parallelo non hanno errori.

Il pensiero corre! Ma l'esperienza dimostra che quello che pensiamo (come dovrebbe essere) e quello che c'è realmente sono molto spesso cose DIVERSE. Cosa si può consigliare: "Pre-stampa l'intera sequenza di esecuzione del tuo codice", - questo è il modo più veloce per trovare un errore (o per essere sicuri di avere ragione). :)
 
yan720:

Hai scritto una risposta in tre punti. Nel primo hai commesso un errore (la mia voce è abbastanza corretta), nel secondo hai anche commesso un errore (anche se l'hai livellato con questo post :) Il terzo punto suonava come se tu suggerissi di spostare il cursore alla fine dopo la voce, non prima (che è stato preso di nuovo come un errore). Di fronte a un quadro del genere, ho preferito fare una precisazione al moderatore multiforme che risponde.

Tuttavia, grazie davvero per la sua risposta. E felice anno nuovo! :)



:D ok, felice anno nuovo anche a te :)
 
Tornando a quanto scritto a pagina 411 ... qualcuno ha idea di come combinare quel codice e le condizioni di entrata/uscita per l'attraversamento di due MA? o gli ordini pendenti sono l'unica opzione?
 
petya33r:
Tornando a quanto scritto a pagina 411 ... qualcuno ha un'idea di come combinare questo codice e le condizioni di entrata/uscita per attraversare due MA? o gli ordini pendenti sono l'unica opzione?

Dopo aver aperto un affare su un segnale di mooving, iniziare a monitorare il numero di ordini o questo ordine in particolare, se il numero di ordini a diminuire o come la seconda opzione è chiusa in particolare questo ordine, quindi scoprire come è stato chiuso, se un arresto, poi apre solo l'ordine opposto al prezzo corrente, questo è tutto
 
Ekburg:

Dopo aver aperto un affare su un segnale in movimento iniziare a monitorare il numero di ordini o questo ordine in particolare, se il numero di ordini a diminuire o come la seconda opzione è chiusa in particolare questo ordine, quindi scoprire come è chiuso, se la fermata, poi basta aprire l'ordine opposto al prezzo corrente, questo è tutto

Lo capisco, ma non posso scriverlo. L'Expert Advisor o fa trading solo sui segnali di muwings e non apre una posizione inversa in caso di perdita, o semplicemente blocca il terminale quando inizia il test. Così ho scritto qualcosa che non può essere elaborato affatto. Non sono molto bravo a scrivere. Ho bisogno di aiuto sotto forma di codice scritto.

//нет открытых ордеров - ищем в истории закрытых ордеров последний закрытый именно этим советником ордер 
  for ( trade = OrdersHistoryTotal() - 1; trade >= 0; trade-- ) 
  {
     if ( OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY) && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() )
     {
         old_order_type = OrderType();
         if ( OrderProfit()<0 ) //последний закрытый советником ордер был убыточным, значит, следующий ордер открываем в направлении, противоположном закрытому с убытком
         {
                break; //прекращаем поиск
         }
     }
  }
  //если раньше покупали, то теперь продаем
  if ( old_order_type == OP_BUY )
  {
      ticket = OrderSend(Symbol(), OP_SELL, Lot,  NormalizeDouble(Bid, Digits), slip, NormalizeDouble(Ask+stoploss*Point, Digits), NormalizeDouble(Ask-takeprofit*Point, Digits), "Martingale-Sell", MagicNumber, 0, Red);
      Sleep (2000); //задержка в 2 секунды для обработки запроса торговым сервером брокера
      return (0);  
  }

Se OrderProfit()<0, aprirà l'ordineopposto. Ma non funziona insieme ai segnali degli ausili in movimento. Potete scrivere un unico codice per fornire sia i segnali di muwings che le condizioni per aprire una posizione opposta?

Motivazione: