Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 70

 

Cari utenti del forum!

Per favore aiutatemi, i problemi sono i seguenti: 1) Come prescrivere nel codice, in modo che l'affare, diciamo, su SELL, si apra quando il confine superiore del canale, e chiuso quando raggiunge il fondo; 2) Con un segnale dovrebbe aprire solo un affare; 3) quando si installa l'EA, l'affare si apre immediatamente, ma si vuole che l'affare sia aperto solo quando la linea del canale viene raggiunta.

Vi sarei molto grato per il vostro aiuto.

extern double Lots = 0.1;
extern int TakeProfit = 30; // TakeProfit (un numero negativo o zero da evitare);
extern int StopLoss = 20; // Livello di stop loss per l'acquisto;
extern inttern Slippage = 2; // slippage
extern string Comment = "Keller";
extern inttern Magic = 333;

extern string Indi = "Dati dell'indicatore";
extern string TimeFrame = "time framecorrente;
extern int int MA_Period = 10; // 0 - SMA, 1 - EMA, 2 - SMMA, 3 - LWMA
extern int Mode_MA = 0; // 0 - Close, 1 - Open, 2 - High, 3 - Low, 4 - Median, 5 - Typical, 6 - Weighted
extern int Price_Type = 5;

doppio PriceHigh, PriceLow, SL, TP;
biglietto int;
//+------------------------------------------------------------------+
//| funzione di inizializzazione dell'esperto |
//+------------------------------------------------------------------+
int init()
{
if (Digits ==3 || Digits ==3) // per un broker a cinque cifre
{
TakeProfit *= 10;
StopLoss *= 10;
Scivolamento *= 10;
}
ritorno(0);
}
//+------------------------------------------------------------------+
//| funzione di deinizializzazione esperto |
//+------------------------------------------------------------------+
int deinit()
{
ritorno(0);
}
//+------------------------------------------------------------------+
//| funzione di inizio esperto |
//+------------------------------------------------------------------+
int start()
{
PriceHigh = iCustom (Symbol(), 0, "Keller", TimeFrame, MA_Period, Mode_MA, Price_Type, 0, 0); // buffer top rosso 0
PriceLow = iCustom (Symbol(), 0, "Tma", TimeFrame, MA_Period, Mode_MA, Price_Type, 2, 0); // buffer di fondo rosso 2

if (Bid >= PriceHigh && CountSell() == 0) // dove Countsell controlla che gli ordini siano aperti uno per uno e non ad ogni tick
{
SL = NormalizeDouble (Bid + StopLoss * Point, Digits);
TP = NormalizeDouble (Bid - TakeProfit * Point, Digits);

ticket = OrderSend (Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, 0, Comment, Magic, 0, Red); // dove 0 è SL e TP (questo è 0 per ßn conti) e l'ultimo 0 è un'azione
if (ticket > 0) // controlla se c'è un ordine aperto
{
if (OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify (ticket, OrderOpenPrice(), SL, TP, 0); // dove 0 è un'espressione
}
}


if (Ask <= PriceLow && CountBuy() == 0)// dove Countsell controlla che gli ordini siano aperti uno per uno, non ad ogni tick
{
SL = NormalizeDouble (Ask - StopLoss * Point, Digits);
TP = NormalizeDouble (Ask + TakeProfit * Point, Digits);

ticket = OrderSend (Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, 0, Comment, Magic, 0, Blue); // dove 0 è SL e TP (questo è 0 per ßn conti), e l'ultimo 0 è un'azione
if (ticket > 0) // controlla se c'è un ordine aperto
{
if (OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES) == true)
OrderModify (ticket, OrderOpenPrice(), SL, TP, 0); // dove 0 è un'espressione
}
}


if (Bid >= PriceHigh && CountBuy() > 0) // se il prezzo ha raggiunto il limite superiore del canale e il numero di ordini è maggiore di 0
{
for (int i=OrdersTotal()-1; i >= 0; i--)
{
se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)== true)
{
if (OrderMagicNumber() == Magic && OrderType() == OP_BUY) // controlla se questo è il nostro ordine di acquisto
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black); // chiude l'ordine al bordo superiore del canale
}
}
}
if (Ask <= PriceLow && CountSell() > 0) // se il prezzo ha raggiunto il limite inferiore del canale e il numero di ordini è maggiore di 0
{
for ( i=OrdersTotal()-1; i >= 0; i--) // nessuna definizione di variabile per comprare
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)== true)
{
if(OrderMagicNumber() == Magic && OrderType() == OP_SELL) // controlla se questo è il nostro ordine di vendita
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black); // chiude l'ordine al bordo inferiore del canale
}
}
}

ritorno(0);
}

//+------------------------------------------------------------------+
int CountSell()// controllo - numero di ordini di vendita in corso
{
int Count = 0;
per (int trade = OrdersTotal() - 1; trade >=0; trade --)
{
OrderSelect (trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
se (OrderType() == OP_SELL)
Conta++;
}
}
return(Count);
}
//+------------------------------------------------------------------+
int CountBuy()// controllo - numero di ordini di acquisto che sono in lavorazione
{
int Count = 0;
per (int trade = OrdersTotal() - 1; trade >=0; trade --)
{
OrderSelect (trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
se (OrderType() == OP_BUY)
Conta++;
}
}
return(Count);
}

 
Aggiungere uno screenshot
 
artmedia70:

No, non l'hanno fatto. Ho dato un'occhiata al tuo codice e ho risposto "senza guardare". La tua linea:

- assegna all'indice del ciclo i un valore pari al numero totale di linee orizzontali. Se ne avete 3, il ciclo sarà da 2 a 0. Non è chiaro cosa ci sia nel vostro ciclo, ma ci saranno solo tre iterazioni da 2 a 0.


Sì, beh... Ed è proprio questo che mi preoccupava. Il fatto è che, senza esperimenti appositamente impostati, ma solo per osservazione, ha funzionato in presenza di altri oggetti.

for(int i=ObjectsTotal(OBJ_HLINE)-1; i>=0; i--) 

E a colpo d'occhio ha funzionato correttamente. Ma c'erano dubbi proprio sulla cosa che hai descritto. Ecco perché ho voluto chiarire questo aspetto.

E sono contento che le vostre opinioni abbiano confermato la mia supposizione. Possiamo considerare che la certezza sulla questione è raggiunta.

Grazie mille ancora una volta!

 
bistreevseh:


Ho un indicatore personalizzato, è un istogramma, tutti i valori sono massimi, importa solo il colore delle barre nell'istogramma, non ha parametri di input, buffer 2: 0 - con barra rossa, e 1 - barra blu, ho scoperto con metodo imperiale, che in 0 buffer, non cambia valore, e in 1 cambia. Come scrivere i criteri per la transazione non riesco a capire, per favore spiega come, grazie in anticipo.


Se avete il codice sorgente dell'indicatore, non è difficile: guardate il codice sorgente e trovate le condizioni per il cambio di colore nell'indicatore. Usandoli, formiamo un segnale. Ci sono 2 modi per farlo, il primo è scrivere un "wrapper" per analizzare le condizioni di cambiamento dei valori del buffer, in questo modo il codice dell'indicatore non viene cambiato, si usa iCustom(), il secondo converte il codice dell'indicatore in una funzione che può essere chiamata dall'Expert Advisor. Entrambi i metodi sono descritti negli articoli del sito web.

Se sei interessato, per esempio, all'indicatore Heikin-Ashi lisciato, guarda sul sito - per questo indicatore c'è stata una discussione, per quanto mi ricordo, sono stati discussi sia la correttezza dell'algoritmo che l'analisi del segnale. Il codice del suo aperto ed è disponibile nella base di codice (ce ne sono molti lì).

Se l'indicatore è unico e non ha codice sorgente, la questione è molto più complicata: reverse engineering, che, tra l'altro, non sempre giustifica lo sforzo.

 
VladislavVG:

Se hai il codice sorgente dell'indicatore, non è difficile: guarda il codice sorgente e trova le condizioni per il cambio di colore nell'indicatore. Usandoli formiamo un segnale. Ci sono 2 modi per farlo: il primo - scrivendo un "wrapper" per l'analisi delle condizioni di cambiamento dei valori del buffer, il codice dell'indicatore non viene cambiato, si usa iCustom(), il secondo - convertendo il codice dell'indicatore nella funzione che può essere chiamata dall'Expert Advisor. Entrambi i metodi sono descritti negli articoli del sito web.

Se sei interessato, per esempio, all'indicatore Heikin-Ashi lisciato, guarda sul sito - per questo indicatore c'è stata una discussione, per quanto mi ricordo, sono stati discussi sia la correttezza dell'algoritmo che l'analisi del segnale. Il codice del suo aperto ed è disponibile nella base di codice (ce ne sono molti lì).

Se l'indicatore è unico e non ha codice sorgente, la questione è molto più complicata: reverse engineering, che, tra l'altro, non sempre giustifica lo sforzo.


Grazie mille, farò una prova. Potreste aiutarmi a trovare articoli sul "wrapping" e sulla conversione del codice degli indicatori, perché temo di non poter interpretare questo in una query di ricerca.
 
Aiuto, per favore. L'indicatore disegna le linee del massimo e del minimo del giorno precedente. Ne ho bisogno per tracciare linee sulla storia ogni giorno. Grazie.
File:
line.mq4  3 kb
 
prom18:
Aiuto, per favore. L'indicatore disegna le linee del massimo e del minimo del giorno precedente. Ne ho bisogno per tracciare linee sulla storia ogni giorno. Grazie.
File:
line_1.mq4  3 kb
 
bistreevseh:

Grazie mille, lo proverò. Potreste aiutarmi a trovare articoli su "wrapper" e trasformare il codice degli indicatori, perché temo di non riuscire a interpretare questo in una query di ricerca.


https://www.mql5.com/ru/forum/114117 ecco un esempio di creazione di una funzione wrapper per interpretare i segnali degli indicatori

qui ci sono articoli sull'uso dei codici indicatori:

https://www.mql5.com/ru/articles/1456

https://www.mql5.com/ru/articles/1457

 
Vinin:



Grazie!
 
VladislavVG:


https://www.mql5.com/ru/forum/114117 ecco un esempio di creazione di una funzione wrapper per interpretare i segnali degli indicatori

qui ci sono articoli sull'uso dei codici indicatori:

https://www.mql5.com/ru/articles/1456

https://www.mql5.com/ru/articles/1457


Ancora una volta, grazie mille.
Motivazione: