Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 722

 
Alexey Viktorov:
Sì, beh... Dove posso trovare un broker come quello... Puoi darmi un link?
Proprio così. L'acquisto chiude a Bid
 
Mi scuso per la mia disattenzione. Ho letto "apre"...
 

Buon pomeriggio,

Domanda:

Potete dirmi per favore perché non posso mettere un acquisto in sospeso:

request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+(offset)*point;

Se offset=1 , alloraapparirà l'errore :

fallito comprare stop 0.10 AUDNZD.m a 1.03748 [prezzo non valido], cioèpiccolo livello prezzo (in mio caso)

Quando lo stesso "ordine di esecuzione" è posto subito dopo

request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK)

tutto funziona bene (cioè, l'ordine viene effettuato):

ordine comprare 0,10 a 1,03747 [#2 comprare 0,10 AUDNZD.m a 1,03747]

Perché la richiesta di un ordine pendente(1.03748) non viene accettata, cioèa 1.03747 viene piazzata, ma a 1.03748 no? (perchéSYMBOL_ASK tiene conto dello spread e dell'offset - l'offset dal prezzo corrente per piazzare l'ordine, in punti, è aumentato di 1)

Ma a offset=100: prezzo pendente BUY_STOP = 1.03847 - funziona già


Grazie.
 
Konstantin_78:

Buon pomeriggio,

Domanda:

Potete dirmi per favore perché non posso mettere un acquisto in sospeso:

request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+(offset)*point;

Se offset=1 , alloraapparirà l'errore :

fallito buy stop 0.10 AUDNZD.m a 1.03748 [prezzo non valido], cioèlivello di prezzo piccolo (nel mio caso)

Quando imposto un "ordine di esecuzione" immediatamente dopo

request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK)

tutto funziona bene (cioè, l'ordine viene effettuato):

ordine comprare 0,10 a 1,03747 [#2 comprare 0,10 AUDNZD.m a 1,03747]

Perché la richiesta di un ordine pendente(1,03748) non viene accettata, cioèa 1,03747 l'ordine viene piazzato, ma a 1,03748 l'ordine è piccolo?

Ma se offset=100: prezzo pendente BUY_STOP = 1,03847, funziona già.


Grazie.

Lei ha già risposto alla sua stessa domanda.

C'è un parametro "stoplevel" - distanza minima necessaria dal prezzo corrente al prezzo di immissione di un ordine pendente - per ogni simbolo ha un proprio valore ed è impostato nelle condizioni di trading

 
Andrey F. Zelinsky:

Вы же сами и ответили на свой вопрос.

Есть такой параметр stoplevel -- минимально необходимое расстояние от текущей цены до цены установки отложенного ордера -- для каждого инструмента своё значение и задаётся в торговых условиях 

Allora sarebbe probabilmente giusto scrivere

prezzo =SymbolInfoDouble(Symbol(),SYMBOL_ASK)+SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL)*point

Anche se, se hai scritto "...dal prezzo attuale ", cosa ha a che fare questo con lo spread? Che è incluso in SYMBOL_ASK (perché SYMBOL_ASK = prezzo aperto + spread).

 
Vladimir Karputov:

Ho allegato un esempio per aiutarvi...

Capisco, l'esempio ha aiutato. Grazie.


Ora, ecco una domanda.

Quando aumento il lotto, ad un certo punto non ci sono abbastanza fondi liberi, e devo aprire con un lotto aumentato.

Cioè, inserire il lotto massimo, tanto quanto FreeMargin permette.

Come scrivere questa condizione: se non ci sono abbastanza fondi per aprire la posizione con il lotto calcolato, la funzione dovrebbe restituire il massimo lotto possibile per aprire la posizione.

double LotA()
{
   double Lot=FirstLot;

   if(DoublingCount<=0) return Lot;
   double MaxLot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   double MainLot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
if(Lot<MainLot)Lot=MainLot;
     if(Lot>MaxLot)Lot=MaxLot;
   double lt1=Lot;
   HistorySelect(0,TimeCurrent());
   if(HistoryOrdersTotal()==0)return(Lot);
   double cl=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-1),ORDER_PRICE_OPEN);
   double op=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_PRICE_OPEN);

   long typeor=HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_TYPE);
   if(typeor==ORDER_TYPE_BUY)
     {
      if(op>cl)
        {
         if(ud<DoublingCount)
           {
            lt1=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_VOLUME_INITIAL)*_C_;
            ud++;
           }
         else ud=0;
        }
      else ud=0;
     }
   if(typeor==ORDER_TYPE_SELL)
     {
      if(cl>op)
        {
         if(ud<DoublingCount)
           {
            lt1=HistoryOrderGetDouble(HistoryOrderGetTicket(HistoryOrdersTotal()-2),ORDER_VOLUME_INITIAL)*_C_;
            ud++;
           }
         else ud=0;
        }
      else ud=0;
     }
   if(lt1>MaxLot)lt1=MaxLot;
   lt1=LotCheck(lt1);
   return(lt1);
  }
//+------------------------------------------------------------------+}
 
Marina Korotkih:

Capisco, l'esempio ha aiutato. Grazie.


Ora questa domanda.

Quando aumento il lotto, ad un certo punto non ci sono abbastanza fondi liberi, e devo aprire con un lotto più grande.

Cioè, inserire il lotto massimo, tanto quanto FreeMargin permette.

Come scrivere questa condizione: se non ci sono abbastanza fondi per aprire la posizione con il lotto calcolato, la funzione dovrebbe restituire il massimo lotto possibile per aprire la posizione.

               

double Mgn,Lot=0,BID,ASK;

    BID=SymbolInfoDouble(_Symbol,SYMBOL_BID);
    ASK=SymbolInfoDouble(_Symbol,SYMBOL_ASK);

   if(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1,ASK,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;

   if(OrderCalcMargin(ORDER_TYPE_SELL,_Symbol,1,BID,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;
                        

Marina, che ne dici di questo?

Si applicano due opzioni di calcolo - una per aprire SELL, e una per aprire BUY

 
Renat Akhtyamov:

                  if(OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1,ASK,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;

                  if(OrderCalcMargin(ORDER_TYPE_SELL,_Symbol,1,BID,Mgn)==true)Lot=AccountInfoDouble(ACCOUNT_MARGIN_FREE)/Mgn;
                        

Marina, potrebbe essere così?

No, non lo è.

Non dovete solo calcolare il massimo lotto possibile, ma anche controllare il tutto per il minimo consentito, perché può succedere che il lotto minimo sia 0,01, e il margine vi permette di aprire solo 0,009, quindi tormentate il server con richieste che non saranno mai accettate, ma possono prendere provvedimenti su di voi)

 
Vitaly Muzichenko:

No, non lo è.

Non dovete solo calcolare il massimo lotto possibile, ma anche controllare il tutto per il minimo ammissibile, perché può succedere che il lotto minimo 0,01, e il margine vi permette di aprire solo 0,009, quindi torturare le richieste del server, che non accetterà mai, ma l'azione su di voi e può prendere)

Scrivi il codice completo, come dovrebbe essere, e vedrò allo stesso tempo....?

Imparerò sempre da voi e vi terrò d'occhio per assicurarmi che le risposte siano complete.

Ho lavorato come supervisore tecnico, non preoccuparti, tutto andrà bene!

Insieme siamo una squadra!

 
Marina Korotkih:

Capisco, l'esempio ha aiutato. Grazie.


Ora questa domanda.

Quando aumento il lotto, ad un certo punto non ci sono abbastanza fondi liberi, e devo aprire con un lotto più grande.

Cioè, inserire il lotto massimo, tanto quanto FreeMargin permette.

Come scrivere questa condizione: se non ci sono abbastanza fondi per aprire la posizione con il lotto calcolato, la funzione dovrebbe restituire il massimo lotto possibile per aprire la posizione.


Un pendio scivoloso su cui ti trovi).
Motivazione: