Mettilo dentro. Non l'ho fatto. Si apre in pacchi. La magia - la ignora.
Quando scrivi del codice, traduci la sua logica in russo. All'inizio, c'è un ciclo in cui vengono fatti dei confronti e se l'ordine selezionato non è un ordine a mercato, allora alla prossima iterazione; se il simbolo non è EURUSD, allora alla prossima iterazione e se il magik non è uguale al vostro magik, allora alla prossima iterazione. Alla fine del ciclo si conta il numero di iterazioni passate prima della fine del ciclo. Il ciclo finisce e il programma inizia ad aprire gli ordini secondo le condizioni. Considerando che una delle condizioni è sempre vera, viene aperto un ordine. E questo accade ad ogni tick.
Quando scrivi il codice, traduci la sua logica in russo. Si ha prima un ciclo in cui si fanno dei confronti; se l'ordine selezionato non è un ordine di mercato, allora alla prossima iterazione; se lo strumento non è l'Eurobucks, allora alla prossima iterazione; e se il magik non è uguale al tuo magik, allora alla prossima iterazione. Alla fine del ciclo si conta il numero di iterazioni passate prima della fine del ciclo. Il ciclo finisce e il programma inizia ad aprire gli ordini secondo le condizioni. Considerando che una delle condizioni è sempre vera, viene aperto un ordine. E questo accade ad ogni tick.
Capisco. Ma in questo caso, se(OrderMagicNumber() == MagicNumber)continua, l'ordine che è stato piazzato viene accettato per un ordine piazzato da Magic(o). Ciò significa che l'ordine piazzato manualmente su EUROBAX deve essere ignorato e un altro ordine deve essere aperto da un Expert Advisor con Magic.
OrdersTotal() - questo è il problema che mette fine a qualsiasi manipolazione con Magic.
Ho capito. Ma in questo caso: if(OrderMagicNumber() == MagicNumber)continua; Gli ordini piazzati sono presi per ordini piazzati da Magic(s). Cioè, un ordine piazzato manualmente su Eurobucks dovrebbe essere ignorato, e un altro dovrebbe essere aperto da un EA con Magic.
OrdersTotal() - questa è l'infestazione che mette fine a qualsiasi manipolazione del mago.
Il codice viene eseguito dall'alto verso il basso. Dopo il ciclo si ha il piazzamento degli ordini. if(OrderMagicNumber() == MagicNumber)continue; Questo interrompe l'esecuzione del corpo del ciclo e inizia una nuova iterazione del ciclo. Il ciclo terminerà e inizierà l'inserimento dell'ordine. Questo è il modo in cui l'avete scritto. Il numero totale di ordini non ha niente a che vedere con questo. Se vuoi fare una condizione che se non ci sono ordini piazzati con il tuo magik e il tuo strumento, allora il Codice di immissione degli ordini dovrebbe essere diverso.
Scorrere i numeri d'ordine. Se un ordine viene trovato con il nostro magik e sul nostro strumento, allora return - exit from start. O una bandiera che il tuo ordine è lì e all'inizio ontik o inizio controllo sulla bandiera.
Ed è meglio creare un EA da un modello per creare uno script EA, un indicatore. I campi del codice principale saranno più corretti.
datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)externint P=1; //Таймфреймexternint MagicNumber = 100500;
int start()
{
int send;
double SL=200;
double TP=200;
double Lots=1;
for(int i = OrdersTotal(); i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == "EURUSD" && OrderMagicNumber() == MagicNumber)return(0);
}
if ((Close[0]>High[1])&&(n==0))
{
send=OrderSend("EURUSD",OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,MagicNumber);
}
if ((Close[0]<Low[1])&&(n==0))
{
send=OrderSend("EURUSD",OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,MagicNumber);
}
return(0);
}
Il codice viene eseguito dall'alto verso il basso. in un ciclo secondo le regole del ciclo. Dopo il ciclo si hanno ordini di piazzamento. if(OrderMagicNumber() == MagicNumber)continue; Questo interrompe l'esecuzione del corpo del ciclo e inizia una nuova iterazione del ciclo. Il ciclo terminerà e inizierà l'inserimento dell'ordine. Questo è il modo in cui l'avete scritto. Il numero totale di ordini non ha niente a che vedere con questo. Se vuoi fare una condizione che se non ci sono ordini piazzati con il tuo magik e il tuo strumento, allora il Codice di immissione degli ordini dovrebbe essere diverso.
Scorrere i numeri d'ordine. Se un ordine viene trovato con il nostro magik e sul nostro strumento, allora return - exit from start. O una bandiera che il tuo ordine è lì e all'inizio ontik o inizio controllo sulla bandiera.
Ed è meglio creare un EA da un modello per creare uno script EA, un indicatore. I campi del codice principale saranno più corretti.
for(int i = OrdersTotal(); i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() == "EURUSD" && OrderMagicNumber() == MagicNumber)return(0);
}
Immagino che questa non sia la soluzione, ma in che direzione lavorare?
Ho provato un paio di dozzine di varianti. O apre un ordine, o senza alcuna interruzione, tuyvukuchu.
Qui, a proposito, su OrderSekect - una variabile di tipo bool dovrebbe essere impostata, altrimenti giurerà.
Persone buone e competenti! Aiuto per implementare l'indicatore Envelopes in un EA MT5. L'EA stesso deve elaborare ogni tick (senza saltare). Ho provato alcune varianti, ho guardato nella documentazione, mi sembra che mi piaccia la variante, ma è per il gestore OnCalculate. Non ho ancora provato con la libreria standard... Bene, ecco la mia implementazione iniziale:
inputint Indicatorperiod = 3;
inputdouble EnvelopesDeviation = 0.07;
int handle; //--- переменная для хранения хэндла индикатора iEnvelopesdouble upperEnv[3], lowerEnv[3]; // динамические массивы для хранения численных значений Emvelopesdouble local_envelopesupper, local_envelopeslower; // в эти переменные пытаюсь получить значения верхней и нижней линии индикатора
...
intOnInit()
...
handle=iEnvelopes(_Symbol,_Period,Indicatorperiod,0,MODE_LWMA,PRICE_OPEN,EnvelopesDeviation);
...
voidOnTick()
...
//--- Объявляем структуру, которая будут использоватьсяMqlRates mrate[3]; // Будет содержать цены, объемы и спред для каждого бараArraySetAsSeries(mrate, true);
//--- Получить исторические данные последних 3-х баровif(CopyRates(_Symbol,_Period,0,3,mrate)!=3)
{
Alert("Ошибка копирования исторических данных - ошибка:",GetLastError(),"!!");
return;
}
//--- Используя хэндлы индикаторов, копируем новые значения индикаторных буферов в массивыif(CopyBuffer(handle,0,0,3,upperEnv)<2 || CopyBuffer(handle,1,0,3,lowerEnv)<2)
{
Alert("Ошибка копирования буферов индикатора Envelopes - номер ошибки:",GetLastError(),"!!");
return;
}
...
local_envelopesupper = upperEnv[1];
local_envelopeslower = lowerEnv[1];
...
Nel tester visivo ottengo:
Puoi dirmi cosa c'è che non va e qual è il modo migliore per farlo?
È meglio che tu scriva l'algoritmo che vuoi fare, non è chiaro cosa ti serve.
Nel primo messaggio c'è il codice. È facile: rompiamo il precedente massimo/basso - apriamo un accordo. Gli ordini aperti da questo EA non devono incrociare gli altri ordini aperti manualmente o da un altro EA, cioè l'EA deve lavorare in modo indipendente.
Ho cercato su Internet. È un argomento piuttosto banale, ma ci sono molte varianti. Sembra essere una cosa semplice, e non si trova da nessuna parte.
Nel primo messaggio, il codice. È semplice: rompi il massimo/basso precedente - apri un trade. Gli ordini aperti da questo EA non devono sovrapporsi ad altri ordini aperti manualmente, o a quelli aperti da un altro EA, cioè l'EA deve lavorare indipendentemente.
Ho cercato su Internet. È un argomento piuttosto banale, ma ci sono molte varianti. Sembra essere una cosa semplice, e non si trova da nessuna parte.
Descrivere il lavoro dell'Expert Advisor in modo completo passo dopo passo. Il primo passo è controllare se ci sono ordini con la nostra magia sul simbolo selezionato. Se li abbiamo, allora finiamo il lavoro e se non li abbiamo, allora stabiliamo gli ordini. Cosa succede dopo che gli ordini sono stati effettuati? Funziona così
Mettilo dentro. Non l'ho fatto. Si apre in pacchi. La magia - la ignora.
Quando scrivi del codice, traduci la sua logica in russo. All'inizio, c'è un ciclo in cui vengono fatti dei confronti e se l'ordine selezionato non è un ordine a mercato, allora alla prossima iterazione; se il simbolo non è EURUSD, allora alla prossima iterazione e se il magik non è uguale al vostro magik, allora alla prossima iterazione. Alla fine del ciclo si conta il numero di iterazioni passate prima della fine del ciclo. Il ciclo finisce e il programma inizia ad aprire gli ordini secondo le condizioni. Considerando che una delle condizioni è sempre vera, viene aperto un ordine. E questo accade ad ogni tick.
Quando scrivi il codice, traduci la sua logica in russo. Si ha prima un ciclo in cui si fanno dei confronti; se l'ordine selezionato non è un ordine di mercato, allora alla prossima iterazione; se lo strumento non è l'Eurobucks, allora alla prossima iterazione; e se il magik non è uguale al tuo magik, allora alla prossima iterazione. Alla fine del ciclo si conta il numero di iterazioni passate prima della fine del ciclo. Il ciclo finisce e il programma inizia ad aprire gli ordini secondo le condizioni. Considerando che una delle condizioni è sempre vera, viene aperto un ordine. E questo accade ad ogni tick.
Capisco. Ma in questo caso, se(OrderMagicNumber() == MagicNumber)continua, l'ordine che è stato piazzato viene accettato per un ordine piazzato da Magic(o). Ciò significa che l'ordine piazzato manualmente su EUROBAX deve essere ignorato e un altro ordine deve essere aperto da un Expert Advisor con Magic.
OrdersTotal() - questo è il problema che mette fine a qualsiasi manipolazione con Magic.Ho capito. Ma in questo caso: if(OrderMagicNumber() == MagicNumber)continua; Gli ordini piazzati sono presi per ordini piazzati da Magic(s). Cioè, un ordine piazzato manualmente su Eurobucks dovrebbe essere ignorato, e un altro dovrebbe essere aperto da un EA con Magic.
OrdersTotal() - questa è l'infestazione che mette fine a qualsiasi manipolazione del mago.Il codice viene eseguito dall'alto verso il basso. Dopo il ciclo si ha il piazzamento degli ordini. if(OrderMagicNumber() == MagicNumber)continue; Questo interrompe l'esecuzione del corpo del ciclo e inizia una nuova iterazione del ciclo. Il ciclo terminerà e inizierà l'inserimento dell'ordine. Questo è il modo in cui l'avete scritto. Il numero totale di ordini non ha niente a che vedere con questo. Se vuoi fare una condizione che se non ci sono ordini piazzati con il tuo magik e il tuo strumento, allora il Codice di immissione degli ordini dovrebbe essere diverso.
Scorrere i numeri d'ordine. Se un ordine viene trovato con il nostro magik e sul nostro strumento, allora return - exit from start. O una bandiera che il tuo ordine è lì e all'inizio ontik o inizio controllo sulla bandiera.
Ed è meglio creare un EA da un modello per creare uno script EA, un indicatore. I campi del codice principale saranno più corretti.
Il codice viene eseguito dall'alto verso il basso. in un ciclo secondo le regole del ciclo. Dopo il ciclo si hanno ordini di piazzamento. if(OrderMagicNumber() == MagicNumber)continue; Questo interrompe l'esecuzione del corpo del ciclo e inizia una nuova iterazione del ciclo. Il ciclo terminerà e inizierà l'inserimento dell'ordine. Questo è il modo in cui l'avete scritto. Il numero totale di ordini non ha niente a che vedere con questo. Se vuoi fare una condizione che se non ci sono ordini piazzati con il tuo magik e il tuo strumento, allora il Codice di immissione degli ordini dovrebbe essere diverso.
Scorrere i numeri d'ordine. Se un ordine viene trovato con il nostro magik e sul nostro strumento, allora return - exit from start. O una bandiera che il tuo ordine è lì e all'inizio ontik o inizio controllo sulla bandiera.
Ed è meglio creare un EA da un modello per creare uno script EA, un indicatore. I campi del codice principale saranno più corretti.
Immagino che questa non sia la soluzione, ma in che direzione lavorare?
Ho provato un paio di dozzine di varianti. O apre un ordine, o senza alcuna interruzione, tuyvukuchu.
Qui, a proposito, su OrderSekect - una variabile di tipo bool dovrebbe essere impostata, altrimenti giurerà.
Questa non è una soluzione, ma da che parte andare?
Ho già provato un paio di dozzine di varianti. O apre un solo ordine, o si apre senza alcuna interruzione.
Qui a proposito, su OrderSekect - una variabile di tipo bool dovrebbe essere impostata, altrimenti giurerà.
Sì, dovrebbe, ritorna al nulla.
È meglio che tu scriva l'algoritmo, cosa che vuoi fare.
Questa non è una soluzione, ma da che parte andare?
Ho già provato un paio di dozzine di varianti. O apre un solo ordine, o si apre senza alcuna interruzione.
Qui a proposito, su OrderSekect - una variabile di tipo bool dovrebbe essere impostata, altrimenti giurerà.
Invece di return(0) dovrebbe essere continue
Persone buone e competenti! Aiuto per implementare l'indicatore Envelopes in un EA MT5. L'EA stesso deve elaborare ogni tick (senza saltare). Ho provato alcune varianti, ho guardato nella documentazione, mi sembra che mi piaccia la variante, ma è per il gestore OnCalculate. Non ho ancora provato con la libreria standard... Bene, ecco la mia implementazione iniziale:
Nel tester visivo ottengo:

Puoi dirmi cosa c'è che non va e qual è il modo migliore per farlo?Sì, dovrebbe giurare, ritorna al nulla.
È meglio che tu scriva l'algoritmo che vuoi fare, non è chiaro cosa ti serve.
Nel primo messaggio c'è il codice. È facile: rompiamo il precedente massimo/basso - apriamo un accordo. Gli ordini aperti da questo EA non devono incrociare gli altri ordini aperti manualmente o da un altro EA, cioè l'EA deve lavorare in modo indipendente.
Ho cercato su Internet. È un argomento piuttosto banale, ma ci sono molte varianti. Sembra essere una cosa semplice, e non si trova da nessuna parte.
Nel primo messaggio, il codice. È semplice: rompi il massimo/basso precedente - apri un trade. Gli ordini aperti da questo EA non devono sovrapporsi ad altri ordini aperti manualmente, o a quelli aperti da un altro EA, cioè l'EA deve lavorare indipendentemente.
Ho cercato su Internet. È un argomento piuttosto banale, ma ci sono molte varianti. Sembra essere una cosa semplice, e non si trova da nessuna parte.
invece di return(0) il significato dovrebbe essere continue