[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non potrei andare da nessuna parte senza di te - 2. - pagina 232

 
drknn:


È necessario richiedere programmaticamente il prezzo del livello. Per fare questo, devi avere l'oggetto "Fibo" messo su un grafico e configurato (tutto programmaticamente). Non è così facile come può sembrare a prima vista. Tuttavia, gli dei non bruciano le stoviglie. Una volta ho dovuto giocare con i livelli di Fibo. E ora sto lavorando con l'elaborazione di questi livelli. In generale, se vuoi puoi capirlo.

Ecco un esempio di codice per creare un Fibo su un grafico.

Ho dovuto fare una subroutine per richiedere il prezzo del livello. Eccola qui (puoi capirla se vuoi)

Cioè, dovremmo aggiungere programmaticamente l'oggetto Fibonacci al ventaglio Fibonacci e scoprire il prezzo del livello solo in questo modo. Ho capito bene?
 
fury2006:
In altre parole, dobbiamo aggiungere l'oggetto Fibonacci al vettore Fibonacci e scoprire il prezzo del livello. Ho capito bene?
Non è necessario allegare un oggetto Fibo standard al grafico. Puoi semplicemente calcolare programmaticamente tutti i livelli Fibo considerando le condizioni esistenti,
inserirli in variabili o in un array e confrontare il prezzo con questi livelli calcolati da te. Questo è esattamente quello che faccio... Anche se - tutto questo è IMHO.
 
artmedia70:
Non è necessario mettere un oggetto Fibo standard sul grafico. Potete semplicemente calcolare programmaticamente tutti i livelli di Fibo basati sulle condizioni esistenti,
metterli in variabili o in un array e confrontare il prezzo con questi livelli che hai calcolato. Questo è esattamente quello che faccio... Anche se - tutto questo è IMHO.
Puoi per favore scrivere un esempio di codice?
 
fury2006:
Puoi per favore scrivere un esempio di codice?
È più complicato di quello suggerito da Vladimir... :))
 
artmedia70:
Ed è più complicato di quello suggerito da Vladimir... :))
Potrebbe piacermi di più :) E inoltre, non vuoi avere oggetti extra sullo schermo. Ce ne saranno comunque molti e quelli non necessari saranno solo d'intralcio.
 
fury2006:
Beh, forse mi piacerà di più :) E inoltre, non voglio oggetti aggiuntivi sullo schermo. Ce ne saranno già in abbondanza, e quelli non necessari ostacoleranno solo

Il mio codice è strettamente legato ai dati ottenuti dall'Expert Advisor per il quale è stato scritto. La funzione è solo una parte dei calcoli necessari e non avrà alcun valore pratico per voi - solo come tutorial per l'autocomprensione. E questo con il resto del codice, dove si fanno tutti i calcoli preliminari.

Se lo rendessi universale, funzionerebbe più lentamente, ma non voglio questo... :)

Ma non c'è di che. Questa funzione è stata riscritta da Excel, dove ho controllato i suoi calcoli. Due parametri sono passati in esso - la rottura di ZigZag (inferiore o superiore, a seconda del tipo di posizione aperta) e il livello di prezzo 23,6 del fib. Il fib non è tracciato come è generalmente accettato, ma si ritiene che il prezzo abbia rotto il fib 23.6 ed è sopra il livello di consolidamento calcolato in anticipo. Lo zero del fib è posto sulla rottura in ZZ, e si apre una posa su 23,6 (quando è rotto). I livelli rimanenti vengono scritti nelle variabili dichiarate a livello globale e successivamente inseriti nell'array degli ordini, da cui si prendono i livelli per ogni posizione aperta.

//=========================================================================================================
void CalcFiboLevel(double priceZZ, double price23)   // Рассчитывает уровни Фибы по нулевому и 23.6 значениям цен
{
   double A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,
          B2,B3,B4,B5,B6,B7,B8,B9,B10,B11;
   
   A2 = 0;                                      // Уровни фибы  
   A3 = 23.6;
   A4 = 38.2;
   A5 = 50.0;
   A6 = 61.8;
   A7 = 78.6;
   A8 = 100.0; 
   A9 = 161.8;  
   A10= 261.8; 
   A11= 423.6;    
   B2 = priceZZ;                                // Цена нулевого уровня фибы (нижний/верхний перелом ЗигЗага)
   B3 = price23;                                // Цена уровня 23.6 фибы (цена открытия позы)
   B4 = ((B3-B2) *(A4-A2) +(A3-A2) *B2)/(A3 -A2);
   B5 = ((B4-B3) *(A5-A3) +(A4-A3) *B3)/(A4 -A3);
   B6 = ((B5-B4) *(A6-A4) +(A5-A4) *B4)/(A5 -A4);
   B7 = ((B6-B5) *(A7-A5) +(A6-A5) *B5)/(A6 -A5);
   B8 = ((B7-B6) *(A8-A6) +(A7-A6) *B6)/(A7 -A6);
   B9 = ((B8-B7) *(A9-A7) +(A8-A7) *B7)/(A8 -A7);
   B10= ((B9-B8) *(A10-A8)+(A9-A8) *B8)/(A9 -A8);
   B11= ((B10-B9)*(A11-A9)+(A10-A9)*B9)/(A10-A9);
   
   
   Fibo38_Price  = B4;                         // ((B3-B2)*(A4-A2)+(A3-A2)*B2)/(A3-A2)
   Fibo50_Price  = B5;                         // ((B4-B3)*(A5-A3)+(A4-A3)*B3)/(A4-A3)
   Fibo61_Price  = B6;                         // ((B5-B4)*(A6-A4)+(A5-A4)*B4)/(A5-A4)
   Fibo78_Price  = B7;                         // ((B6-B5)*(A7-A5)+(A6-A5)*B5)/(A6-A5)
   Fibo100_Price = B8;                         // ((B7-B6)*(A8-A6)+(A7-A6)*B6)/(A7-A6)
   Fibo161_Price = B9;                         // ((B8-B7)*(A9-A7)+(A8-A7)*B7)/(A8-A7)
   Fibo261_Price = B10;                        // ((B9-B8)*(A10-A8)+(A9-A8)*B8)/(A9-A8)
   Fibo423_Price = B11;                        // ((B10-B9)*(A11-A9)+(A10-A9)*B9)/(A10-A9)

   return;
}

Per quanto riguarda il suo utilizzo, dovrei sventrare l'intero Expert Advisor per capirlo...

 
artmedia70:

Il mio codice è strettamente legato ai dati ottenuti dall'Expert Advisor per cui è stato scritto. La funzione è solo una parte dei calcoli necessari e non avrà alcun valore pratico per voi - solo come tutorial per l'autocomprensione. E questo insieme al resto del codice, dove vengono fatti tutti i calcoli preliminari.

Se lo rendessi universale, sarebbe più lento, e non lo voglio... :)

Ma non c'è di che. Questa funzione è riscritta da Excel, dove ho controllato i suoi calcoli. Gli vengono passati due parametri - la rottura dello ZigZag (inferiore o superiore, a seconda del tipo di posizione aperta) e il livello di prezzo 23,6 del fib. Il fib non è tracciato come è generalmente accettato, ma si ritiene che il prezzo abbia rotto il fib 23.6 ed è sopra il livello di consolidamento calcolato in anticipo. Lo zero del fib è posto sulla rottura in ZZ, e una posa è aperta su 23,6 (quando è rotto). I livelli rimanenti vengono scritti nelle variabili dichiarate a livello globale e successivamente inseriti nell'array degli ordini, da cui si prendono i livelli per ogni posizione aperta.

Per quanto riguarda il modo di usarlo, si dovrebbe sventrare l'intero Expert Advisor per renderlo chiaro...

È fantastico, mi hai dato un'idea.
 

Ciao a tutti! Per favore, aiutatemi a combinare le seguenti cose. Il risultato dovrebbe essere: due linee che seguono il prezzo, una più bassa della Ask di 20 pip..,

Inoltre, ricevo un segnale acustico se il prezzo cambia di 20 punti per 1 tick.

Tutto funziona bene separatamente. Grazie in anticipo!

1) La linea sotto l'Ask di 20 pip.

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int start()
{
ObjectCreate("MyPriceLine", OBJ_HLINE, 0, 0, Ask-20*Point) ;
ObjectSet("MyPriceLine", OBJPROP_PRICE1, Ask-20*Point);
return(0);
}

//+------------------------------------------------------------------+

2) La linea è 20 pip sopra l'Ask.

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int start()
{
ObjectCreate("MyPriceLine", OBJ_HLINE, 0, 0, Ask+20*Point) ;
ObjectSet("MyPriceLine", OBJPROP_PRICE1, Ask+20*Point);
return(0);
}

//+------------------------------------------------------------------+

3) Tasso di variazione dei prezzi nel tempo.

#property show_inputs

extern int pips=2; //изменение аск
extern double Time_=0.1; //c. ~ tick
extern bool все_из_обзора_рынка=true; // только текущий символ - false

int i, l, p, количество_символов;
string val[], на_экран;
int Ask_save[];

//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
void start(){
количество_символов=SymbolsList(val, true);//запись в массив val инструменты и их количество вызов функции SymbolsList
ArrayResize(Ask_save,количество_символов);
if(количество_символов == -1){ Alert("Ошибка открытия файла в SymbolsList(string &Symbols[], bool Selected)"); return;}
if(!все_из_обзора_рынка){
количество_символов=1;
ArrayResize(Ask_save,количество_символов);
ArrayResize(val,количество_символов);
val[0]=Symbol();
}

while(true&&!IsStopped()){ //если разрешить и не отанавливать скрипт продолжим

Alert("пересчитаем через "+Time_+" сек.");

for(i=0;i<количество_символов;i++){//посчитаем стоимость спреда для инструментов из обзора рынка
if((Ask_save[i]-MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT))>=pips){
Alert(val[i]+","+Period()+" изменился вниз на "+DoubleToStr((Ask_save[i]-MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT)),0)+" pips");
PlaySound("timeout.wav");
}
if((MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT)-Ask_save[i])>=pips){
Alert(val[i]+","+Period()+" изменился вверх на "+DoubleToStr((MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT)-Ask_save[i]),0)+" pips");
PlaySound("email.wav");
}
Ask_save[i]=MarketInfo(val[i],MODE_ASK)/MarketInfo(val[i],MODE_POINT);
}
Sleep(Time_*1000);//пауза сек.
}

/*
количество_символов=SymbolsList(val, true);//запись в массив val инструменты и их количество вызов функции SymbolsList
if(количество_символов == -1){ Alert("Ошибка открытия файла в SymbolsList(string &Symbols[], bool Selected)"); return;}

while(true&&!IsStopped()){ //если разрешить и не отанавливать скрипт продолжим
на_экран="\r\n"; //отступ
for(i=0;i<количество_символов;i++)//посчитаем стоимость спреда для инструментов из обзора рынка
на_экран=на_экран+val[i]+" стоимость спреда = " + DoubleToStr(MarketInfo(val[i],MODE_SPREAD)*MarketInfo(val[i],MODE_TICKVALUE),0)+"\r\n";
Comment(на_экран);//выведем на экран
Alert("Пересчитаем");//сигнал
Sleep(3000);//пауза 3 сек.
}
*/
}
void deinit(){Comment("");}
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=


//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
// функция читает из обзора рынка все фин.инстр.
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
int SymbolsList(string &Symbols[], bool Selected){
int Offset, SymbolsNumber; string SymbolsFileName;
if(Selected) SymbolsFileName = "symbols.sel"; else SymbolsFileName = "symbols.raw";
int hFile = FileOpenHistory(SymbolsFileName, FILE_BIN|FILE_READ);
if(hFile < 0) return(-1); if(Selected) { SymbolsNumber = (FileSize(hFile) - 4) / 128; Offset = 116; }
else { SymbolsNumber = FileSize(hFile) / 1936; Offset = 1924; }
ArrayResize(Symbols, SymbolsNumber);
if(Selected) FileSeek(hFile, 4, SEEK_SET);
for(int i = 0; i < SymbolsNumber; i++){Symbols[i] = FileReadString(hFile, 12); FileSeek(hFile, Offset, SEEK_CUR);}
FileClose(hFile);
return(SymbolsNumber);
}
 

Puoi spiegare perché questo codice a volte si blocca in un punto e bisogna riavviare il terminale per riprenderlo?

int ticket,err;
         Alert("nachalo");
         ticket = OrderSend(Symbol (), OP_BUY, 1, Ask, 10,0,0, "dsgdsf", 0, 0, CLR_NONE);
         err = GetLastError();
         Alert (err);
         Alert("konec");
         OrderClose (ticket,1,Bid,5,CLR_NONE);
         Alert ("zakrito");
 
globad:

Ciao a tutti! Per favore, aiutatemi a combinare le seguenti cose. Il risultato dovrebbe essere: due linee che seguono il prezzo, una più bassa della Ask di 20 pip..,

Inoltre, ricevo un segnale acustico se il prezzo cambia di 20 punti per 1 tick.

Tutto funziona bene separatamente. Grazie in anticipo!

1) La linea sotto l'Ask di 20 pip.

2) La linea è 20 pip sopra l'Ask.

3) Tasso di variazione dei prezzi nel tempo.


Sembra essere già noioso... È elementare, Watson:

ObjectCreate("MyPriceLine", OBJ_HLINE, 0, 0, Ask-20*Point) ;

È il nome di una singola linea.

Suggerimento: cercate il nome della seconda linea. È diverso dal primo?

Sì, e perché continuare a costruire una struttura già costruita?

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int start()
{
ObjectCreate("MyPriceLine", OBJ_HLINE, 0, 0, Ask+20*Point) ;
ObjectSet("MyPriceLine", OBJPROP_PRICE1, Ask+20*Point);
return(0);
}

//+------------------------------------------------------------------+

Ora guardate la differenza:

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int start()
{
if (ObjectFind("MyPriceLine")<0) ObjectCreate("MyPriceLine", OBJ_HLINE, 0, 0, Ask+20*Point) ;
ObjectSet("MyPriceLine", OBJPROP_PRICE1, Ask+20*Point);
return(0);
}

//+------------------------------------------------------------------+
Motivazione: