[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 10

 
tol64:
Potete consigliarmi se è possibile determinare programmaticamente la possibilità di impostare uno stop loss/stake profit immediatamente all'apertura della posizione/impostazione di un ordine pendente o dopo?


Controllate in anticipo i livelli di stop e di profitto.

Gli identificatori di richiesta usati nella funzione MarketInfo(). Può essere uno dei seguenti valori:

Costante . Valore Descrizione
MODO_BASSO 1 Prezzo minimo giornaliero
MODO_ALTO 2 Prezzo massimo giornaliero
MODO_TIME 5 Ora dell'ultima citazione
MODE_BID 9 Ultimo prezzo d'offerta ricevuto. Per lo strumento corrente è memorizzato nella variabile predefinita Bid
MODE_ASK 10 Ultimo prezzo Ask ricevuto. Memorizzato nella variabile predefinita Ask for the current symbol
MODO_POINT 11 Dimensione del punto nella valuta di quotazione. Memorizzato nella variabile predefinita Point per il simbolo corrente
MODE_DIGITS 12 Numero di cifre dopo il punto decimale nel prezzo dello strumento. Memorizzato nella variabile predefinita Digits per il simbolo corrente
MODE_SPREAD 13 Spread in pip
MODE_STOPLEVEL 14 Livello minimo ammissibile di Stop Loss/Stake Profit in pip
MODE_LOTSIZE 15 Dimensione del contratto nella valuta di base dello strumento
MODE_TICKVALUE 16 Dimensione minima del cambiamento del prezzo dello strumento nella valuta di deposito
MODE_TICKSIZE 17 Passo minimo della variazione del prezzo dello strumento nella valuta di quotazione
MODE_SWAPLONG 18 Dimensione dello swap per le posizioni lunghe
MODE_SWAPSHORT 19 Dimensione dello swap per le posizioni corte
MODE_STARTING 20 Data di inizio del calendario (di solito usata per i futures)
MODALITÀ_SCADENZA 21 Data di scadenza (normalmente usata per i futures)
MODO_COMMERCIALE PERMESSO 22 Permesso di negoziare lo strumento specificato
MODE_MINLOT 23 Dimensione minima del lotto
MODE_LOTSTEP 24 Passo di cambiamento della dimensione del lotto
MODE_MAXLOT 25 Dimensione massima del lotto
MODE_SWAPTYPE 26 Metodo di calcolo degli swap. 0 - in punti; 1 - in valuta base dello strumento; 2 - in percentuali; 3 - in valuta di margine.
MODE_PROFITCALCMODE 27 Modalità di calcolo del profitto. 0 - Forex; 1 - CFD; 2 - Futures
MODO_MARGALCMODE 28 Modalità di calcolo del margine. 0 - Forex; 1 - CFD; 2 - Futures; 3 - CFD su indici
MODALITÀ_MARGININIT 29 Margine iniziale richiesto per 1 lotto
MODALITÀ_MARGINE-MANUTENZIONE 30 Importo del requisito di margine per sostenere le posizioni aperte per 1 lotto
MODO_MARGINE COPERTO 31 Margine addebitato su posizioni sovrapposte per 1 lotto
MODO_MARGINE RICHIESTO 32 Quantità di fondi liberi, necessari per aprire 1 lotto per l'acquisto
LIVELLO DI CONGELAMENTO 33 Livello di congelamento degli ordini in punti. Se il prezzo di esecuzione è entro i limiti definiti dal livello di congelamento, l'ordine non può essere modificato, cancellato o chiuso.

 
SeALALex:

Sto appena imparando a scrivere un EA, come molti dei miei primi EA su indicatori standard, ne ho appena scritto uno nuovo, ma ora ho complicato il mio compito. In generale, come fare, che nell'emergere di condizioni aperto una posizione e quando si chiude, prendiamo le stesse condizioni quando si salva il nuovo non ha aperto, e aperto solo quando le condizioni opposte, ecc Grazie!!!


c'è un esempio già pronto nell'aiuto

int i,accTotal=OrdersHistoryTotal(); for(i=0;i<accTotal;i++) { //---- controllare il risultato della selezione if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error accessing historical database (",GetLastError(),"); break;
       } Dobbiamo ricordare il tempo di chiusura dell'ordine, confrontare il tempo di chiusura dell'ordine con il tempo di chiusura nell'iterazione precedente, se (il tempo di chiusura è più alto e il tipo di operazione commerciale è Buy o Sell), allora dovremmo ricordare il tempo dell'ordine corrente e il tipo di operazione commerciale // come risultato, alla fine del ciclo sappiamo il tipo di ordine che ha chiuso per ultimo } Qualcosa come questo .

 
ivandurak:


Precontrollare i livelli di stop e di impostazione dei profitti .


Non c'è nessun controllo in questa lista per alcuni tipi di conto. Ecco un paragrafo del regolamento delle operazioni di trading per i conti NDD:

3.3 Se una posizione viene aperta attraverso il terminale del cliente utilizzando un Expert Advisor, il cliente non può designare ordini di Stop Loss e/o Take Profit. Se il cliente desidera piazzare questi ordini, può farlo modificando una posizione esistente in conformità alle clausole 5.16 - 5.22 e 9.13 - 9.16.

Mi sto chiedendo se è possibile controllare questo programmaticamente. Da quanto ho capito, no. Inizialmente devi scrivere nel programma una funzione per aprire posizioni/impostare ordini pendenti, tenendo conto delle condizioni che sono state impostate dal broker.
 
tol64:


Non c'è nessun controllo in questa lista per alcuni tipi di conto. Ecco un paragrafo del regolamento delle operazioni di trading per i conti NDD:

Mi interessa sapere se questo può essere controllato programmaticamente. Da quanto ho capito, no. Dovete originariamente scrivere in un programma una funzione per aprire posizioni / impostare ordini pendenti, tenendo conto delle condizioni che sono impostate dal broker.

Non capisco bene le regole per impostare gli ordini, prova a giocare con la demo e vedi cosa puoi e non puoi fare. Per quanto ho capito nulla ti impedisce di impostare programmaticamente un ordine e poi modificarlo. Giusto è strano, a meno che tu non tagli la connessione dopo aver aperto una posizione senza lasciare alcuno stop.
 
tol64:


Non c'è nessun controllo in questa lista per alcuni tipi di conto. Ecco un paragrafo del regolamento delle operazioni di trading per i conti NDD:

Mi interessa sapere se questo può essere controllato programmaticamente. Da quanto ho capito, no. Inizialmente devi scrivere una funzione per aprire posizioni/impostare ordini pendenti nel programma, tenendo conto delle condizioni stabilite dal broker.

Non c'è nessun problema. Anche (se non per uso personale, perché si sa su quali conti (condizioni di trading e con chi) usarlo), ma se si invia l'EA per ordinare e il cliente non ha ancora deciso su quali conti e dove sarà utilizzato, anche su tipi di conto con la possibilità di impostare un take e stop immediato, allora di default produrre l'EA con valori zero di questi livelli quando si impostano tutti i tipi di ordini, poi con la loro modifica (funzionerà lì e lì), mentre, naturalmente, nessuno ha annullato i requisiti di controllo e le restrizioni a p.
 
ivandurak:

Non capisco bene le regole per impostare gli ordini, provate a giocare con la demo, cosa potete e cosa no. Per quanto ho capito nulla ti impedisce di impostare programmaticamente un ordine e poi modificarlo. Giusto è strano, a meno che tu non tagli la connessione dopo aver aperto una posizione senza lasciare alcuno stop.

))) No. Lei mi fraintende completamente. Non ho scritto di "impostare programmaticamente", ho scritto di definire programmaticamente. Su alcuni tipi di conto non è possibile aprire immediatamente una posizione e impostare stop/stop, il che sarebbe preferibile/sicuro per me. Su mql5, se non mi sbaglio, sembra essere possibile determinarlo. Vorrei essere in grado di determinare questo e, a seconda della definizione, scegliere quale funzione utilizzare.
 
Roman.:

Non c'è nessun problema. Anche (se non per uso personale, perché si sa su quali conti (condizioni di trading e con chi) usarlo), ma se si fa un EA per ordinare e il cliente non ha ancora deciso su quali conti e dove lo userà, anche su tipi di conto con la possibilità di impostare subito un take e stop, allora si fa comunque un EA con valori nulli di questi livelli di default quando si impostano tutti i tipi di ordini, poi con la loro modifica (funzionerà lì e lì), mentre, ovviamente, nessuno ha cancellato i requisiti di controllo e le restrizioni a p

Sì, non c'è problema quando c'è una soluzione. Devi solo usare quello che hai e usarlo correttamente).
 

Roman. e ivandurak grazie mille per le vostre risposte, ma questo è ancora difficile da capire per me. Ho trovato un suggerimento su un altro forum su come fare questo, ma finora non posso applicarlo al mio solito codice

int BuyTrue, SellTrue;// definire le variabili che serviranno come queste bandiere
....
//--- Condizioni per l'acquisto
if (BuyTrue==0 && ... più le vostre altre condizioni) //condizione di posizione aperta
{
....
OrderSend(....); //funzione per aprire un ordine
BuyTrue=1; // Se BuyTrue=1, la condizione per l'apertura della posizione non sarà completamente soddisfatta
// di conseguenza, ad un segnale di acquisto ripetuto non verrà aperta una negoziazione
SellTrue=0; // A SellTrue=0 la condizione di apertura della posizione sarà completamente soddisfatta
// quindi il prossimo trade sarà solo Sell
....
}

//--- Condizione per la vendita
if (SellTrue==0 && ... più le vostre altre condizioni) //condizione di posizione aperta
{
....
OrderSend(....); //funzione per aprire un ordine
SellTrue=1; // Se SellTrue=1, la condizione di apertura dell'ordine non sarà completamente soddisfatta
// quindi, ad un secondo segnale Sell non verrà aperta una posizione
BuyTrue=0; // A BuyTrue=0 la condizione di apertura della posizione sarà completamente soddisfatta
// di conseguenza, il prossimo trade sarà solo Buy
....
}

Il mio codice per aprire una posizione

total=OrdersTotal();
se(totale<1)
{
// nessun ordine aperto identificato
se(AccountFreeMargin()<(1000*Lots))
{
Print("Non abbiamo soldi. Free Margin = ", AccountFreeMargin();
ritorno(0);
}
// controlla la posizione lunga (BUY)
if(MACD1<0 && MACD2<MACD1 && MACD2>MACD3 && MathAbs(MACD1)>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "macd sample",16384,0,Green);
se(biglietto>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordine BUY aperto: ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
ritorno(0);
}
// controllare la posizione corta (SELL)
if(MACD1>0 && MACD2>MACD1 && MACD1>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "macd sample",16384,0,Red);
se(biglietto>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Stampa("Ordine SELL aperto: ",OrderOpenPrice())
}
else Print("Error opening SELL order : ",GetLastError());
ritorno(0);
}
ritorno(0);
}

 
SeALALex:

Roman. e ivandurak grazie mille per le vostre risposte, ma questo è ancora difficile da capire per me. Ho trovato un suggerimento su un altro forum su come fare questo, ma finora non posso applicarlo al mio solito codice

int BuyTrue, SellTrue;// definire le variabili che serviranno come bandiere descritte sopra
....
//--- Condizioni per l'acquisto
if (BuyTrue==0 && ... più le vostre altre condizioni) //condizione di posizione aperta
{
....
OrderSend(....); //funzione per aprire un ordine
BuyTrue=1; // Se BuyTrue=1, la condizione per l'apertura della posizione non sarà completamente soddisfatta
// di conseguenza, ad un segnale di acquisto ripetuto non verrà aperta una negoziazione
SellTrue=0; // A SellTrue=0 la condizione di apertura della posizione sarà completamente soddisfatta
// quindi il prossimo trade sarà solo Sell
....
}

//--- Condizione per la vendita
if (SellTrue==0 && ... più le vostre altre condizioni) //condizione di posizione aperta
{
....
OrderSend(....); //funzione per aprire un ordine
SellTrue=1; // Se SellTrue=1, la condizione di apertura dell'ordine non sarà completamente soddisfatta
// quindi, ad un secondo segnale Sell non verrà aperta una posizione
BuyTrue=0; // A BuyTrue=0 la condizione di apertura della posizione sarà completamente soddisfatta
// di conseguenza, il prossimo trade sarà solo Buy
....
}

Il mio codice per aprire un affare.

total=OrdersTotal();
se(totale<1)
{
// nessun ordine aperto identificato
se(AccountFreeMargin()<(1000*Lots))
{
Print("Non abbiamo soldi. Free Margin = ", AccountFreeMargin();
ritorno(0);
}
// controlla la posizione lunga (BUY)
if(MACD1<0 && MACD2<MACD1 && MACD2>MACD3 && MathAbs(MACD1)>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "macd sample",16384,0,Green);
se(biglietto>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordine BUY aperto: ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
ritorno(0);
}
// controllare la posizione corta (SELL)
if(MACD1>0 && MACD2>MACD1 && MACD1>(MACDOpenLevel*Point))
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "macd sample",16384,0,Red);
se(biglietto>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Stampa("Ordine SELL aperto: ",OrderOpenPrice())
}
else Print("Error opening SELL order : ",GetLastError());
ritorno(0);
}
ritorno(0);
}


Prima di tutto, incolla il tuo codice nell'editor tramite Ctrl+Alt+M (o premi SRC in cima al menu), altrimenti è male, cosa è chiaro - tutto si fonde sotto uno...:-))

In secondo luogo, leggete il tutorial, in particolare le informazioni sul link che ho consigliato, sotto il codice c'è la sua descrizione e proprio alla fine della descrizione è descritto con precisione - come segnalare una volta un prezzo sopra/sotto la MA (avrete un'analogia con una singola entrata ad una data condizione di trading - l'uso di bandiere e tutto), prima di LAVORARE il vostro Wizard ... :-)))

P.S. o ricerca su google: Come inserire correttamente il codice sito:mql4.com

 






if (SellTrue==0 && A1<A2 && S1<30 && ADX1<ADX2) // Условие открытия позы
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"AO sample",16384,0,Red);
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES ||SellTrue==1)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
        
        if (ticket > 0 && SellTrue==1)   
     {
      SellTrue=1;
      BuyTrue=0;                 
      Alert("По данным условиям сделка уже открывалась"); // Сообщение 
     }
        }
      return(0);
Romano. Non funziona, cosa c'è che non va?
Motivazione: