Announcement

Collapse
No announcement yet.

ERR_NOT_ENOUGH_MONEY 134 Not enough money.

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    ERR_NOT_ENOUGH_MONEY 134 Not enough money.

    Buonasera,
    ho scritto un EA che dopo alcuni calcoli apre una posizione con un lotto fisso per ogni cross. Attualmente la strategia funziona senza alcun bug di programmazione. L'EA fa il suo lavoro (in reale e in demo). Il problema e che se avvio il tester non apre nessuna posizione perchè mi da
    ERR_NOT_ENOUGH_MONEY 134 Not enough money.
    Facendo delle ricerche mi sembra di aver capito che è dovuto a un problema di lotti o margine. Ho letto thread in inglese e non ci ho capito molto, anche perchè mi sono reso conto che ci sono un bel pò di accorgimenti da usare se si vuole tradare in cross differenti.
    In un forum qualcuno scriveva di usare questo codice:

    Code:
     //--- extern variables extern double ExtMaximumRisk=0.05;             // 5% by default  //--- calculate current volume double CalculateVolume()   {    double lot_min =MarketInfo(Symbol(),MODE_MINLOT);    double lot_max =MarketInfo(Symbol(),MODE_MAXLOT);    double lot_step=MarketInfo(Symbol(),MODE_LOTSTEP);    double contract=MarketInfo(Symbol(),MODE_LOTSIZE);    double vol; //--- check data    if(lot_min<0 || lot_max<=0.0 || lot_step<=0.0)       {       Print("CalculateVolume: invalid MarketInfo() results [",lot_min,",",lot_max,",",lot_step,"]");       return(0);      }    if(AccountLeverage()<=0)      {       Print("CalculateVolume: invalid AccountLeverage() [",AccountLeverage(),"]");       return(0);      } //--- basic formula    vol=NormalizeDouble(AccountFreeMargin()*ExtMaximumRisk*AccountLeverage()/contract,2); //--- additional calculation //   ... //--- check min, max and step    vol=NormalizeDouble(vol/lot_step,0)*lot_step;    if(vol<lot_min) vol=lot_min;    if(vol>lot_max) vol=lot_max; //---    return(vol);   }
    Non ho capito esattamente cosa restituisce e come può risolvere il problema. Sapete aiutarmi?
    Last edited by cadddami; 03-02-2018, 15:07. Reason: Riparazione link discussione non funzionante...

    #2
    dovresti darci maggiori informazioni, amuzzu:

    - su quale strumento finanziario stai provando a fare senza successo il backtest
    - qual è la valuta del conto con cui fai il backtest
    - qual è il valore del conto di partenza del backtest
    - qual è la leva finanziaria che hai sulla demo con cui fai il backtest

    queste domande solo per iniziare...
    La vita non è un giro di prova, cogli l’attimo..
    Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

    Comment


      #3
      Buonasera, scusa il ritardo.
      Prima di eseguire la ordersend faccio il seguente controllo:

      Code:
      StopLoss=VerificaLotSize(Symbol(),StopLoss);
         if(ConfermaMargine(Symbol(),OP_BUY,StopLoss))
      Per verificare che la dimensione del lotto sia:

      Sopra la dimensione minima del lotto consentita
      Sotto la dimensione massima del lotto consentita
      Consente lotti micro o mini secondo il broker.
      A partire dalla dichiarazione, è possibile che il valore di ritorno sia la dimensione effettiva del lotto verificato.
      Ci sono due argomenti, il simbolo per cui vuoi aprire l'ordine e la dimensione del lotto che vuoi aprire.

      Code:
      double VerificaLotSize(string Simbolo,double LotSize) {
      
      LotSize=MarketInfo(Simbolo,MODE_LOTSTEP)==0.1?NormalizeDouble(LotSize,1):NormalizeDouble(LotSize,2);
      return MathMax(MarketInfo(Simbolo,MODE_MINLOT),MathMin(MarketInfo(Simbolo,MODE_MAXLOT),LotSize));
      }

      verifica se c'e margine sufficiente prima di aprire l'ordine. Quindi, se si sa quanti lotti si vuole negoziare tramite la funzione VerificaLotSize()
      questo passaggio controllerà se c'e margine sufficiente per aprire l'ordine.

      ci sono due modalità per calcolare se hai margine sufficiente per aprire l'ordine:

      0 - calcolo del rapporto percentuale tra margine e patrimonio netto.
      1 - confronto del livello di margine libero sul valore assoluto.

      In entrambi i casi, se il controllo fallisce e l'apertura dell'ordine risulta in una situazione in cui non si ha abbastanza margine,
      verrà generato l'errore 134. In questo caso la funzione fallisce e verrà restituito un valore falso. Altrimenti, se entrambi i controlli passano,
      verrà restituito un vero e si può procedere e aprire questa posizione.

      Code:
      bool ConfermaMargine(string Simbolo,int OrdineType,double LotSize) {
        
         if(AccountStopoutMode()==0 && MathRound(AccountMargin()+AccountFreeMargin()-AccountFreeMarginCheck(Simbolo,OrdineType,LotSize))!=0 && (100*AccountEquity()/(AccountMargin()+AccountFreeMargin()-AccountFreeMarginCheck(Simbolo,OrdineType,LotSize)))<AccountStopoutLevel() && GetLastError()==134)
           {
            return false;
           }
         else if(AccountStopoutMode()==1 && AccountFreeMarginCheck(Simbolo,OrdineType,LotSize)<AccountStopoutLevel() && GetLastError()==134)
           {
            return false;
           }
         return true;
        }
      Non sto più eseguendo il backtest, ma un conto demo.
      Saldo 100000 €
      Lotti inviati 0.15
      Cross: NZDJPY
      Errore: 134 non c'e margine

      Comment


        #4
        delle 4 domande che ti avevo fatto non hai risposto a:

        qual è la valuta del conto con cui fai il backtest ?

        --> Prova a fare il backtest con valuta del conto NZD o JPY (quindi né EUR né USD) ma una delle due della coppia di valute su cui fai il backtest

        -------------

        Altra possibile problematica è la seguente: potrebbe darsi che il lotto minimo consentito per NZDJPY sia 0.1 e non 0.01

        perciò un trade di 0.15 non è consentito... da qui l'errore

        --> Prova a fare un backtest con lotto fisso di 0.1 o 0.2 quindi senza la seconda cifra decimale


        La vita non è un giro di prova, cogli l’attimo..
        Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

        Comment


          #5
          La valuta è in euro.
          Ma sto facendo girare l'ea in demo senza fare backtest (live apre posizioni che nel test non apre).

          Comment


            #6
            ma che c'entra che stai facendo girare l'EA in demo?

            se fai un backtest la piattaforma in modalità Tester NON riesce a convertire il conto in EUR rispetto alla quotazione NZD o JPG e quindi ti dà errore.

            Invece in demo l'EA legge la conversione dai dati di mercato

            In backtest l'EA ha solo i dati della coppia di valute su cui opera.
            La vita non è un giro di prova, cogli l’attimo..
            Realizzazione per Metatrader4 di trading system, indicatori, pattern grafici, Ottimizzazioni IS-OOS su Forex e CFD, Analisi di Portafoglio .

            Comment


              #7
              Con verificalotsize il problema del lotto minimo consentito viene risolta. Cerco di aprire con quella permessa.

              Comment


                #8
                Avevo scritto che non sto più eseguendo il backtest e che ho questo problema in demo.

                Comment

                Working...
                X