Problemi di controllo degli scambi aperti - pagina 5

 
BrotherPyrus:
Ciao Daz & Co,

hothand funziona su MT4 a cinque cifre, ma non su una piattaforma a quattro cifre.
Puoi essere più specifico su come non funziona?
 
BrotherPyrus:
hothand funziona su MT4 a cinque cifre, ma non su una piattaforma a quattro cifre. Qualche idea su cosa causi questo e qualche indizio su come risolverlo?
Gli EA devono regolare per 4/5 cifre, TP, SL e slippage. Sui broker ECN è necessario aprire prima e poi impostare gli stop.
//++++ These are adjusted for 5 digit brokers.
int     pips2points;    // slippage  3 pips    3=points    30=points
double  pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)
int     init(){
    if (Digits == 5 || Digits == 3){    // Adjust for five (5) digit brokers.
                pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
    } else {    pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; }
    // OrderSend(... Slippage.Pips * pips2points, Bid - StopLossPips * pips2dbl
 
   if(iBarHour >= iOpenHour && iBarHour <= iOpenHour + iBarsToTrade && Tradeopen()==false) // Check if time is ok to trade & no trade is open
                  {

                          
                              //  if(High[2]>High[1] && Low[2]<Low[1]) // see if we have an inside bar
                                if(iHigh(hothand(), 60, 2)>iHigh(hothand(), 60, 1) && iLow(hothand(), 60, 2) < iLow(hothand(), 60, 1)) // see if we have an inside bar
                                 {                                                                                                     // on the hothand pair
                                           
                                        // IB found 
                                        if(iHigh(hothand(), 60, 1) > dDayOpenPrice) // IB high on hothand pair is greater than day open price bullish signal
                                          {
                                             int    buyspread=MarketInfo(hothand(),MODE_SPREAD);
                              double buyentry =  iHigh(hothand(), 60, 1) + 10 + buyspread;  //Low of prev bar + 1 pip + spread
                              double buystop = iLow(hothand(), 60, 1) - 10;    //Low of prev bar - 1 pip
                              double buytpx1 = iHigh(hothand(), 60, 1)+(iHigh(hothand(), 60, 1)-iLow(hothand(), 60, 1)); //1:1 r:r
                              double buytpx3 = iHigh(hothand(), 60, 1)+(iHigh(hothand(), 60, 1)-iLow(hothand(), 60, 1))*3; // 1:3 r:r
                              
                              
                           OrderSend(Symbol(),OP_BUY,1 , Ask, 3, buystop, buytpx1, "DIBSBUY", Mnumber1);  //Open buy order
                           OrderSend(Symbol(),OP_BUY,1 , Ask, 3, buystop, buytpx3, "DIBSBUY", Mnumber3);
                            }
                            
                         if(iLow(hothand(), 60, 1) < dDayOpenPrice) // IB low on hothand pair is lower than day open price bearish signal
                            {
                              int    sellspread=MarketInfo(hothand(),MODE_SPREAD);
                              double sellentry = iLow(hothand(), 60, 1)-10; //Low of prev bar - 1 pip 
                              double sellstop = iHigh(hothand(), 60, 1)+ 10 + sellspread; // High of prev bar + 1 pip + Spread
                              double selltpx1 = iLow(hothand(), 60, 1)-(iHigh(hothand(), 60, 1)- iLow(hothand(), 60, 1)); //1:1 r:r
                              double selltpx3 = iLow(hothand(), 60, 1)-(iHigh(hothand(), 60, 1)- iLow(hothand(), 60, 1))*3; // 1:3 r:r
                              
                              
                           OrderSend(Symbol(),OP_SELL,1 , Ask, 3, sellstop, selltpx1,"DIBSSELL",Mnumber1);  //Open Sell Order
                           OrderSend(Symbol(),OP_SELL,1 , Ask, 3, sellstop, selltpx3,"DIBSSELL",Mnumber3);  //Open Sell Order
               
                                      } 
                        }
                               
                   }
     //  
  
    
      }

Bene, sono tornato,


Questa è la parte del mio codice dove vengono eseguiti i trade, lavorerò solo con 5 cifre per il momento. L'idea qui è che ho usato la mia funzione hothand per scegliere quale coppia è meglio scambiare per il giorno. Questo codice dovrebbe cercare una barra interna sul grafico a 1 ora. (La funzione hothand restituisce una stringa della coppia btw) Quando trova una barra interna, ho appena ottenuto di aprire un'operazione di acquisto o vendita piatta a scopo di test. Non sono sicuro che il backtester possa gestire il trading di più coppie da un grafico? Ho scaricato la cronologia a 1 minuto per tutte le coppie che usa. Ma sembra solo aprire trade sull'eurusd che è il grafico a cui l'ho allegato,

WHRoeder grazie per essere passato e per avermi aiutato di nuovo. Quindi il modo corretto di aprire un trade con un ea è quello di aprirlo e poi tornare indietro e riempire gli sl e i tp dopo che è stato aperto? Sono sicuro che puoi individuare un milione di cose sbagliate con questo codice.

 
  1. OrderSend(Symbol(),OP_BUY,1 , Ask, 3, buystop, buytpx1, "DIBSBUY", Mnumber1);  //Open buy order
    

    Non regola lo slippage per 4/5 cifre. Non è compatibile con l'ECN

    Testate sempre i codici di ritorno in modo da scoprire PERCHE' non funziona

    int ticket = OrderSend(Symbol(),OP_BUY,1 , Ask, 3, buystop, buytpx1, "DIBSBUY", Mnumber1);  //Open buy order
    if (ticket < 0) Alert("OrderSend [1] failed: ",GetLastError());

  2. buystop = iLow(hothand()...
    I vostri stop sono basati sulla coppia hothand(), ma state aprendo un ordine con Symbol(). Se non sono la stessa cosa gli stop sono completamente fasulli
 
dazamate:

Bene, sono tornato,


Questa è la parte del mio codice dove vengono eseguiti i trade, lavorerò solo con 5 cifre per il momento. L'idea qui è che ho usato la mia funzione hothand per scegliere quale coppia è meglio scambiare per il giorno. Questo codice dovrebbe cercare una barra interna sul grafico a 1 ora. (La funzione hothand restituisce una stringa della coppia, btw) Quando trova una barra interna, ho appena ottenuto di aprire un'operazione di acquisto o vendita piatta per scopi di test. Non sono sicuro che il backtester possa gestire il trading di più coppie da un grafico? Ho scaricato la cronologia a 1 minuto per tutte le coppie che usa. Ma sembra aprire operazioni solo su eurusd, che è il grafico a cui l'ho allegato,


Alcuni commenti generali:

si compra all'Ask e si vende al Bid

se il vostro broker è un broker di tipo ECN non potete impostare SL e TP quando piazzate l'ordine (in questo caso impostateli a 0), dovete piazzare l'ordine, poi modificare l'ordine per aggiungere SL e TP

controlla sempre il risultato del piazzamento di un ordine e controlla gli errori restituiti, dovrai gestirli agendo di conseguenza

se pensate di avere questo EA su più grafici, cioè di piazzare ordini da più grafici, avrete bisogno di un qualche tipo di Mutex per evitare l'Order Context Busy (controllate i post di WHRoeder, lui ha un eccellente Mutex)

 
Damm WHRoeder, hai ragione "i nostri stop sono basati sulla coppia hothand(), ma tu stai aprendo un ordine con Symbol()" Non l'avevo notato. Che stupido. Questa roba diventa così faticosa mentalmente mentre si cerca di impararla. Ma sì, stupido. Grazie per aver ripassato quel casino. Probabilmente farò una pausa e tornerò domani con la mente più libera. Ill sistema le cose che hai indicato.
 
dazamate:

Ma sembra che apra solo operazioni sull'eurusd, che è il grafico a cui l'ho allegato,

Sì, . . .

OrderSend(Symbol(),OP_SELL,1 , Ask, 3, sellstop, selltpx1,"DIBSSELL",Mnumber1);  //Open Sell Order

Symbol () è la coppia a cui è collegato l'EA/Indicator, intendevi fare così invece?

OrderSend(hothand(),OP_SELL,1 , Ask, 3, sellstop, selltpx1,"DIBSSELL",Mnumber1);  //Open Sell Order
 

Sì, volevo farlo, ma ora ottengo questo errore


http://clip2net.com/s/144hq


Come se non riconoscesse la coppia in uscita dalla funzione hothand. L'output della funzione hothand è una stringa, quindi non vedo perché non funzioni

 
dazamate:
Come se non riconoscesse l'output di coppia della funzione hothand. L'output della funzione hothand è una stringa quindi non vedo cosa non funzioni
OrderSend(hothand(),OP_SELL,1 , Ask, 3, sellstop, selltpx1,"DIBSSELL",Mnumber1);  //Open Sell Order
  1. Ask/Bid è il prezzo corrente di Symbol() ma stai cercando di aprire un'altra coppia. Prezzo fasullo.
  2. Non è possibile ottenere i valori di bar zero dal tester per altri TF/coppie
  3. Non puoi aprire trade di altre coppie nel tester, IIRC
  4. nome simbolo sconosciuto USDCHF per la funzione OrderSend
    Dove prendi quella stringa? Il grafico attuale è lo stesso modello, o USD, EUR, o USD/EUR, o USDEURm, o USDEURfxf ecc.
  5. Ti suggerisco di negoziare SOLO la coppia attuale. Se hothand() non è la corrente, niente trade. In questo modo funziona nel tester, puoi sempre mettere l'EA su altre coppie controllando così quali coppie scambia, ed eviti tutte le insidie.
 

Ciao ragazzi, sto cercando di fare del codice che faccia quanto segue


extern string  sComment4                = "Max Hours allowed before pending orders are deleted";
extern int     pendinglimit        = 4;

// * EVERYTIME A TRADE GETS TRIGGERED 

bartraded = TimeHour(TimeCurrent());


// DELETE PENDING ORDERS THAT HAVE NOT BEEN TRIGGERED WITHIN 

   if(TimeHour(TimeCurrent()) > bartraded + pendinglimit && Tradeopen()==true) // Check to see if pending orders have expired
     {
        for(int tnumber = OrdersTotal()-1; tnumber >= 0 ; tnumber--)  //scan through open orders
        {
          if (OrderSelect(tnumber, SELECT_BY_POS) &&   
           OrderType()==(OP_BUYSTOP||OP_SELLSTOP) &&     // The order selected is either a pending buy on stop order or a buy on sell order
            OrderMagicNumber()==(Mnumber1||Mnumber3))    // The orders magic number is the same as the magic number used in this ea
          
               {
                OrderSelect(tnumber, SELECT_BY_POS);     // Select order
                OrderDelete(tnumber);                    // Delete it
               }
        }
     }

Se un ordine pendente è stato aperto per x barre lo cancella se il numero di barre ha superato x


Forse c'è qualcosa di sbagliato nella mia logica?

Motivazione: