Aprire l'ordine opposto

 

Ciao a tutti,

Vorrei avere da voi un aiuto per affrontare questo problema;

Quando un ordine è aperto e il prezzo è inferiore al prezzo di apertura dell 'ordine, voglio aprire un ordine opposto.

In questo caso particolare sto cercando di usare questo codice ma senza successo. Qualcuno può dare un aiuto qui?

Grazie in anticipo

Luis

double OpenOppositeOrder() 
 {
  int Op;  
 // for(int Counter=0;Counter<=OrdersTotal()-1;Counter++)
  for(int Counter=OrdersTotal()-1;Counter>=0;Counter--)
  {
   OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES);
   {
    if(OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNumber)
    {
     Op=OrderType();
     if(Op==OP_BUY && NormalizeDouble(Bid,Digits)*UsePoint<OpenPrice)
     {      
     SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,NormalizeDouble(Bid,Digits),UseSlippage,0,0,"Sell Order",MagicNumber,0,Red);
     if(SellTicket>0)AddLimitsSell();
      }
     if(Op==OP_SELL && NormalizeDouble(Ask,Digits)*UsePoint>OpenPrice)
     {      
     BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,NormalizeDouble(Ask,Digits),UseSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(BuyTicket>0)AddLimitsBuy();
      }
     }
    }
   }
  }
 
luisneves:

Ciao a tutti,

Vorrei avere da voi un aiuto per affrontare questo problema;

Quando un ordine è aperto e il prezzo è inferiore al prezzo di apertura dell'ordine, voglio aprire un ordine opposto.

In questo caso particolare sto cercando di usare questo codice ma senza successo. Qualcuno può dare un aiuto qui?

Grazie in anticipo

Luis

Potresti rispondere a questa domanda, ti aiuterà molto:

1. Qual è il valore di ritorno di OrderSelect() - leggere la documentazione di OrderSelect ti aiuterà a rispondere a questo.

2. Quale errore quando non riesci a inviare l'ordine?

 
luisneves:

Ciao a tutti,

Vorrei avere da voi un aiuto per affrontare questo problema;

Quando un ordine è aperto e il prezzo è inferiore al prezzo di apertura dell'ordine, voglio aprire un ordine opposto.

In questo caso particolare sto cercando di usare questo codice ma senza successo. Qualcuno può dare un aiuto qui?

A cosa serve la variabileUsePoint? Se mi spieghi perché la stai usando, probabilmente capirai qual è il tuo problema... inoltre... da dove viene il valore diOpenPrice ?


Non vuoi sapere se il tuo OrderSend() funziona o no ? e se fallisce non vuoi sapere perché ? non vuoi sapere quali sono le variabili rilevanti quando fallisce ?

Leggete questo:cosa sono i valori di ritorno delle funzioni? Come si usano?

 

Ciao RaptorUK;

Grazie per la tua pronta risposta;

UsePoint è per regolare per 5 punti decimali, quindi è Point*10

OpenPrice è OrderOpenPrice()

Grazie

Luis

 
luisneves:

Ciao RaptorUK;

Grazie per la tua pronta risposta;

UsePoint è per regolare per 5 punti decimali quindi è Point*10

Puoi spiegare perché lo stai usando in questa situazione?

 

Ciao RaptorUK,

hai ragione. Devo solo usarlo per TakeProfit e Stoploss (credo...)

 
luisneves:

Ciao RaptorUK,

hai ragione. Devo solo usarlo per TakeProfit e Stoploss (credo...)

Grazie per aver risposto e per averci pensato :-)
 

Ciao RaptorUK,

Ho dato un'occhiata al link che hai fornito e ho messo sul codice la routine di errore e l'errore che è appena tornato dice 2012.11.06 06:40 market order ecn v1 EURUSDi,M5: Order Send failed, error # 4051.

Poi sul codice ho fatto alcune modifiche su OrderSelect e usare Ticket, ma le cose ancora non funzionano. Ho anche fatto una ricerca per il significato e quello che ho trovato èERR_INVALID_FUNCTION_PARAMVALUE (4051) e purtroppo non so

come arrivare da qui...

double OpenOppositeOrder() 
 {
  int Op;  
 // for(int Counter=0;Counter<=OrdersTotal()-1;Counter++)
  for(int Counter=OrdersTotal()-1;Counter>=0;Counter--)
  {
   //OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES);
   OrderSelect(Ticket,SELECT_BY_TICKET);
   {
    if(OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNumber)
    {
     Op=OrderType();
     if(Op==OP_BUY && NormalizeDouble(Bid,Digits)<OpenPrice)
     {      
     Ticket = OrderSend(Symbol(),OP_SELL,LotSize,NormalizeDouble(Bid,Digits),UseSlippage,0,0,"Sell Order",MagicNumber,0,Red);
     if(Ticket>0)AddLimitsSell();
      } 
      if( Ticket > 0 )
   {
   Print("Order placed # ", Ticket);
   }
else
   {
   Print("Order Send failed, error # ", GetLastError() );
   }
     if(Op==OP_SELL && NormalizeDouble(Ask,Digits)>OpenPrice)
     {      
     Ticket = OrderSend(Symbol(),OP_BUY,LotSize,NormalizeDouble(Ask,Digits),UseSlippage,0,0,"Buy Order",MagicNumber,0,Green);
     if(Ticket>0)AddLimitsBuy();
      }
      if( Ticket > 0 )
   {
   Print("Order placed # ", Ticket);
   }
else
   {
   Print("Order Send failed, error # ", GetLastError() );
   }
      
      
     }
    }
   }
  }


 
luisneves:

Ciao RaptorUK,

Ho dato un'occhiata al link che hai fornito e ho messo sul codice la routine di errore e l'errore che è appena tornato dice 2012.11.06 06:40 market order ecn v1 EURUSDi,M5: Order Send failed, error # 4051.

Poi sul codice ho fatto alcune modifiche su OrderSelect e usare Ticket, ma le cose ancora non funzionano. Ho anche fatto una ricerca per il significato e quello che ho trovato èERR_INVALID_FUNCTION_PARAMVALUE (4051) e purtroppo non so

come arrivare da qui...

Devi controllare i valori che stai inviando alla funzione OrderSend(). . . sono del tipo corretto ? per esempio,UseSlippage deve essere un int, sembra un bool .. . LotSize è un double? è nel range corretto ? maggiore di Min Lot e minore di Max Lot e un multiplo di Lot Step ?
 
RaptorUK:
Devi controllare i valori che invii alla funzione OrderSend() . . . sono del tipo corretto ? per esempio,UseSlippage deve essere un int, sembra un bool .. . LotSize è un double? è nel range corretto ? maggiore di Min Lot e minore di Max Lot e un multiplo di Lot Step ?


Ciao RaptorUK,

Scusate se vi ho fatto perdere tempo, probabilmente inizierete a stancarvi di me. Quindi Slippage è un int e LotSize è un doppio....e le cose vanno ancora male....

Mi sforzo ancora di capire questo ma sembra che la mia ignoranza se ne stia approfittando(...)

Per volte sembra che potrebbe essere qualche problema con il Tester e poi lo provo su Demo. E qui non posso avere un ordine opposto che si apre se il prezzo è inferiore (per l'acquisto) all'OrderOpenPrice.

Per favore, potreste dare un'occhiata al codice allegato?

Non voglio assolutamente che codifichiate per me ma solo un piccolo aiuto.

Grazie in anticipo per qualsiasi aiuto fornito e per la vostra pazienza

Luis

File:
 
luisneves:


Ciao RaptorUK,

Scusate se vi ho fatto perdere tempo, probabilmente inizierete a stancarvi di me. Quindi Slippage è un int e LotSize è un doppio....e le cose vanno ancora male....

Mi sforzo ancora di capire questo ma sembra che la mia ignoranza se ne stia approfittando(...)

Per volte sembra che potrebbe essere qualche problema con il Tester e poi lo provo su Demo. E qui non posso avere un ordine opposto che si apre se il prezzo è inferiore (per l'acquisto) all'OrderOpenPrice.

Per favore, potreste dare un'occhiata al codice allegato?

Non voglio assolutamente che codifichiate per me ma solo un piccolo aiuto.

Grazie in anticipo per qualsiasi aiuto fornito e anche per la vostra pazienza

Perché hai cambiato il codice corretto con quello scorretto?

Il tuo ciclo stava attraversando tutti gli ordini che si trovano nel Trades Pool ( ordini aperti e pendenti) . . . ora questo codice non ha senso, da dove viene il ticket nel primo passaggio del ciclo?

 for(int Counter=OrdersTotal()-1; Counter>=0; Counter--)
  {
   //OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES);
   OrderSelect( Ticket,  SELECT_BY_TICKET);


Un'altra domanda per te. ... perché questa funzione è di tipo doppio quando non restituisce nulla?

Motivazione: