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

 
artmedia70:

Un'altra cosa...

Durante i test, ho rimosso tutte le indulgenze che vengono caricate automaticamente dal modello (il modello ha il nome di un EA e viene caricato automaticamente durante i test) dalla finestra del grafico.

Nel diario del tester è costantemente scritto del successo del caricamento dell'indulgenza dell'utente e segue immediatamente con una registrazione della sua cancellazione. E così va avanti durante tutto il test...

È normale o è una cosa negativa?

Come posso rimediare?


Forse rispondo in ritardo, ma io stesso ho affrontato una situazione simile. Non è buono :)

Ho tali record nella rivista, quando chiamo un indicatore personalizzato attraverso iCustom(), ho dimenticato di passare uno dei parametri per errore. Il compilatore non tiene traccia di questi errori, anche durante il test poiché il nome dell'indicatore è corretto, MT scrive che tutto viene caricato con successo, ma il numero di parametri non viene controllato, e poiché i parametri sono specificati in modo errato, si verifica un errore nell'indicatore e viene scaricato immediatamente. Ho notato che il test viene eseguito lentamente e il registro è lo stesso:

01:11:13 2000.01.03 02:00 EMMA_Update_2 EURUSD,M15: caricato con successo

01:11:13 2000.01.03 02:00 EMMA_Update_2 EURUSD,M15: rimosso

01:11:13 2000.01.03 02:01 EMMA_Update_2 EURUSD,M15: caricato con successo

01:11:13 2000.01.03 02:01 EMMA_Update_2 EURUSD,M15: rimosso

Ho iniziato a guardarci dentro e ho trovato un tale problema a causa della mia disattenzione, ho provato a mettere/rimuovere l'indicatore da esso "al volo", non ho visto nessuna "animazione" nel log in questa occasione, il problema era con iCustom(), quindi controllalo per sicurezza :)

 

ToLik_SRGV:

tutto il problema era con iCustom(), quindi controllate per sicurezza :)

È vero, era dovuto a un numero sbagliato di argomenti.
 

Dare consigli su come impostare la data di scadenza di un ordine in sospeso.

In qualche modo non sembra voler funzionare per me, e non ci sono molte informazioni al riguardo nel manuale.

Se puoi farmi un esempio.

Grazie in anticipo.

 
ToLik_SRGV:

Risposta tardiva, probabilmente, ma mi sono imbattuto anch'io in questo. Questo non è buono :)

Ho tali record nel diario, quando chiamo un indicatore personalizzato attraverso iCustom(), ho dimenticato di passare uno dei parametri per errore. Il compilatore non tiene traccia di questi errori, anche durante il test poiché il nome dell'indicatore è corretto, MT scrive che tutto viene caricato con successo, ma il numero di parametri non viene controllato, e poiché i parametri sono specificati in modo errato, si verifica un errore nell'indicatore e viene scaricato immediatamente. Ho notato che il test viene eseguito lentamente e il registro è lo stesso:

01:11:13 2000.01.03 02:00 EMMA_Update_2 EURUSD,M15: caricato con successo

01:11:13 2000.01.03 02:00 EMMA_Update_2 EURUSD,M15: rimosso

01:11:13 2000.01.03 02:01 EMMA_Update_2 EURUSD,M15: caricato con successo

01:11:13 2000.01.03 02:01 EMMA_Update_2 EURUSD,M15: rimosso

Ho iniziato a guardarci dentro e ho trovato un tale problema a causa della mia disattenzione, ho provato a mettere/rimuovere l'indicatore da esso "al volo", non ho visto nessuna "animazione" nel log in questa occasione, il problema era con iCustom(), quindi controllalo per sicurezza :)

No, non è troppo tardi... Proprio così, grazie.
 
kwadrad:

Dare consigli su come impostare la data di scadenza di un ordine in sospeso.

In qualche modo non sembra voler funzionare per me, e non ci sono molte informazioni al riguardo nel manuale.

Se puoi farmi un esempio.

Grazie in anticipo.

Qui. Questo è quello che faccio...

   double   tp,PriceOpn,PriceTake;
   string   sy=Symbol();
   double pa=MarketInfo(sy, MODE_ASK);
   double pb=MarketInfo(sy, MODE_BID);
   double po=MarketInfo(sy, MODE_POINT);

   Magic=511;
   Lots_New=NormalizeLot(Lots/2, False, NULL);
         
   PriceOpn  = NormalizePrice(pa+DistORD*po, NULL);
   PriceTake = NormalizePrice(pa+(DistORD+tp)*po, NULL);
 //------------------------------------------------------------------
   SetOrder(NULL, OP_BUYSTOP, Lots_New, PriceOpn, 0, PriceTake, Magic, TimeCurrent()+12*60); // 12 часов срок его жизни...
 //------------------------------------------------------------------
//==============================================================================================

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 02.08.2008                                                     |
//|  Описание : Установка ордера.                                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    pp - цена                                                               |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - Magic Number                                                       |
//|    co - комментарий                                                        |
//|    ex - Срок истечения                                                     |
//+----------------------------------------------------------------------------+
void SetOrder(string sy, int op, double ll, double pp,
              double sl=0, double tp=0, int mn=0, string co="", datetime ex=0) {
  color    cl=IIFc(op==OP_BUYLIMIT || op==OP_BUYSTOP, clOpenBuy, clOpenSell);
  datetime ot;
  double   pa, pb, mp;
  int      err, it, ticket, msl;

  if (sy=="" || sy=="0") sy=Symbol();
  msl=MarketInfo(sy, MODE_STOPLEVEL);
  if (co=="") co=WindowExpertName()+" "+GetNameTF(Period());
  if (ex>0 && ex<TimeCurrent()) ex=0;
  for (it=1; it<=NumberOfTry; it++) {
    if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) {
      Print("SetOrder(): Остановка работы функции");
      break;
    }
    while (!IsTradeAllowed()) Sleep(5000);
    RefreshRates();
    ot=TimeCurrent();
    ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, co, mn, ex, cl);
    if (ticket>0) {
      if (UseSound) PlaySound(SoundSuccess); break;
    } else {
      err=GetLastError();
      if (err==128 || err==142 || err==143) {
        Sleep(1000*66);
        if (ExistOrders(sy, op, mn, ot)) {
          if (UseSound) PlaySound(SoundSuccess); break;
        }
        Print("Error(",err,") set order: ",ErrorDescription(err),", try ",it);
        continue;
      }
      if (UseSound) PlaySound(SoundError);
      mp=MarketInfo(sy, MODE_POINT);
      pa=MarketInfo(sy, MODE_ASK);
      pb=MarketInfo(sy, MODE_BID);
      if (pa==0 && pb==0) Message("SetOrder(): Проверьте в обзоре рынка наличие символа "+sy);
      Print("Error(",err,") set order: ",ErrorDescription(err),", try ",it);
      Print("Ask=",pa,"  Bid=",pb,"  sy=",sy,"  ll=",ll,"  op=",GetNameOP(op),
            "  pp=",pp,"  sl=",sl,"  tp=",tp,"  mn=",mn);
      // Неправильные стопы
      if (err==130) {
        // Корректировка ценовых уровней
        if (modeSetOrders==1) {
          Sleep(1000*5.3);
          switch (op) {
            case OP_BUYLIMIT:
              if (pp>pa-msl*mp) pp=pa-msl*mp;
              if (sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp;
              if (tp>0 && tp<pp+(msl+1)*mp) tp=pp+(msl+1)*mp;
              break;
            case OP_BUYSTOP:
              if (pp<pa+(msl+1)*mp) pp=pa+(msl+1)*mp;
              if (sl>pp-(msl+1)*mp) sl=pp-(msl+1)*mp;
              if (tp>0 && tp<pp+(msl+1)*mp) tp=pp+(msl+1)*mp;
              break;
            case OP_SELLLIMIT:
              if (pp<pb+msl*mp) pp=pb+msl*mp;
              if (sl>0 && sl<pp+(msl+1)*mp) sl=pp+(msl+1)*mp;
              if (tp>pp-(msl+1)*mp) tp=pp-(msl+1)*mp;
              break;
            case OP_SELLSTOP:
              if (pp>pb-msl*mp) pp=pb-msl*mp;
              if (sl>0 && sl<pp+(msl+1)*mp) sl=pp+(msl+1)*mp;
              if (tp>pp-(msl+1)*mp) tp=pp-(msl+1)*mp;
              break;
          }
          Print("SetOrder(): Скорректированы ценовые уровни");
          continue;
        }
        // Вход по текущим ценам
        if (modeSetOrders==2) {
          Print("SetOrder(): Вход по текущим ценам");
          if (op==OP_BUYLIMIT || op==OP_BUYSTOP) OpenPosition(sy, OP_BUY, ll, sl, tp, mn, co);
          if (op==OP_SELLLIMIT || op==OP_SELLSTOP) OpenPosition(sy, OP_SELL, ll, sl, tp, mn, co);
          break;
        }
      }
      // Блокировка работы советника
      if (err==2 || err==64 || err==65 || err==133) {
        gbDisabled=True; break;
      }
      // Длительная пауза
      if (err==4 || err==131 || err==132) {
        Sleep(1000*300); break;
      }
      // Слишком частые запросы (8) или слишком много запросов (141)
      if (err==8 || err==141) Sleep(1000*100);
      if (err==139 || err==140 || err==148) break;
      // Ожидание освобождения подсистемы торговли
      if (err==146) while (IsTradeContextBusy()) Sleep(1000*11);
      // Обнуление даты истечения
      if (err==147) {
        ex=0; continue;
      }
      if (err!=135 && err!=138) Sleep(1000*7.7);
    }
  }
}
 
artmedia70:

Qui. Questo è quello che faccio...




О. Grazie.

Dovete capire che questo è il lasso di tempo in minuti dall'apertura?

 
kwadrad:


О. Grazie.

Dovrei capire che questo è il lasso di tempo in minuti dall'apertura?

Sì, nell'esempio della durata di 12 ore... 12*60 minuti
 

So che può sembrare OffTop, ma per me, come un nuovo arrivato nella scrittura di esperti (e nella programmazione in generale, senza considerare la mia esperienza di programmazione assembler per Spectrum venti anni fa), la mia domanda, ma piuttosto.... Dai, è solo una domanda, sarebbe proprio il caso:

Testando l'EA su uno storico di due anni, ho notato dei mesi in cui c'è un drawdown molto forte. Questa è una domanda per i veterani: quali metodi di gestione dei drawdowns sono disponibili in quanto tali, cosa potete consigliare secondo voi il più efficace.

Dal mio punto di vista, vedo due metodi finora:

1. Congelare tutto il trading nel caso in cui l'equity drawdown superi di un certo numero di percento e
1.1 per ogni posizione. Dopo il punto di pareggio, collegare un trailing stop e fissare lo stop ad una piccola distanza da Ask/Bid, assicurandosi così un piccolo profitto e poi tirare gli stop dopo il prezzo, chiudendo parzialmente le posizioni (per liberare fondi) quando viene raggiunto un certo numero di punti di guadagno.
1.2. Dopo che il patrimonio netto è salito di una certa percentuale, inizia lentamente a commerciare...

2. Al contrario, avendo disabilitato il trade principale, dobbiamo utilizzare il mezzo lotto, ma con una grande quantità di ordini, seguendo rigorosamente la tendenza con un piccolo trailing stop dopo il punto di pareggio.

Penso che il primo modo eviterà un'ulteriore grande diminuzione del capitale ma dovrai aspettare molto tempo perché il mercato si avvicini agli ordini
il secondo modo mangerà il margine ma in caso di posizioni a breve termine puoi aggiungere rapidamente del denaro alla posizione...

Finora vedo solo due modi opposti.

Cosa consigliate, compagni? Qualsiasi, anche il più, a prima vista "folle-nonsense" pensieri e suggerimenti sono benvenuti...

Grazie in anticipo :)

 
Il tester non permette di testare su più di un quotidiano?
 
artmedia70:
Il tester non permette di testare su più di un quotidiano?


Ы

State preparando un EA per l'interbancario?