[Archiv!] Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Könnte nirgendwo ohne dich hingehen - 2. - Seite 232

 
drknn:


Sie müssen den Preis der Stufe programmatisch abfragen. Dazu müssen Sie das "Fibo"-Objekt in ein Diagramm einfügen und konfigurieren (alles programmatisch). Es ist nicht so einfach, wie es auf den ersten Blick scheint. Aber die Götter lassen den Topf nicht anbrennen. Ich musste einmal mit Fibo-Levels spielen. Und jetzt arbeite ich mit der Verarbeitung dieser Ebenen. Im Allgemeinen können Sie es herausfinden, wenn Sie wollen.

Hier ist ein Beispiel für einen Code zur Erstellung eines Fibo in einem Diagramm.

Ich musste ein Unterprogramm erstellen, um den Preis des Levels abzufragen. Hier ist es (Sie können es herausfinden, wenn Sie wollen)

D.h., wir sollten das Fibonacci-Objekt programmatisch zum Fibonacci-Fächer hinzufügen und den Preis des Levels nur auf diese Weise herausfinden. Habe ich es richtig verstanden?
 
fury2006:
Mit anderen Worten, wir müssen das Fibonacci-Objekt zum Fibonacci-Vektor hinzufügen und nur so den Preis des Levels herausfinden. Habe ich das richtig verstanden?
Es ist nicht notwendig, ein Standard-Fibo-Objekt an das Diagramm anzuhängen. Sie können einfach programmatisch alle Fibo-Levels unter Berücksichtigung der bestehenden Bedingungen berechnen,
geben Sie sie in Variablen oder ein Array ein und vergleichen Sie den Preis mit diesen selbst berechneten Werten. Das ist genau das, was ich tue... Allerdings ist dies alles nur IMHO.
 
artmedia70:
Es ist nicht notwendig, ein Standard-Fibo-Objekt in das Diagramm einzufügen. Sie können einfach alle Fibo-Levels auf der Grundlage der bestehenden Bedingungen programmatisch berechnen,
Geben Sie sie in Variablen oder ein Array ein und vergleichen Sie den Preis mit diesen von Ihnen berechneten Werten. Das ist genau das, was ich tue... Allerdings ist dies alles nur IMHO.
Können Sie bitte ein Codebeispiel schreiben?
 
fury2006:
Können Sie bitte ein Codebeispiel schreiben?
Es ist komplizierter als das, was Vladimir Ihnen angeboten hat... :))
 
artmedia70:
Und es ist komplizierter als das, was Vladimir vorgeschlagen hat... :))
Es könnte mir besser gefallen :) Außerdem wollen Sie keine zusätzlichen Objekte auf dem Bildschirm haben, denn davon gibt es ohnehin schon genug, und alle unnötigen sind nur im Weg.
 
fury2006:
Nun, vielleicht gefällt es mir dann besser :) Außerdem möchte ich keine zusätzlichen Objekte auf dem Bildschirm haben, denn davon gibt es schon genug, und unnötige Objekte sind nur hinderlich

Mein Code ist eng an die Daten gebunden, die der Expert Advisor, für den er geschrieben wurde, liefert. Die Funktion ist nur ein Teil der notwendigen Berechnungen und wird für Sie keinen praktischen Wert haben - nur als Anleitung zum Selbstverständnis. Das gilt auch für den Rest des Codes, in dem alle vorläufigen Berechnungen vorgenommen werden.

Wenn ich es universal machen würde, würde es langsamer funktionieren, aber das will ich nicht... :)

Aber Sie sind willkommen. Diese Funktion wurde von Excel umgeschrieben, wo ich ihre Berechnungen überprüft habe. Es werden zwei Parameter übergeben - der Bruch des ZigZag (unterer oder oberer, je nach Art der eröffneten Position) und das Preisniveau 23,6 des Fib. Die Fib wird nicht, wie allgemein üblich, eingezeichnet, aber es wird davon ausgegangen, dass der Preis die 23,6 Fib durchbrochen hat und über dem im Voraus berechneten Konsolidierungsniveau liegt. Der Nullpunkt der Fib wird auf den Bruch in ZZ gelegt, und eine Pose wird am 23.6. eröffnet (wenn sie gebrochen wird). Die verbleibenden Niveaus werden in die auf der globalen Ebene deklarierten Variablen geschrieben und anschließend in das Array der Aufträge eingegeben, aus dem die Niveaus für jede offene Position entnommen werden.

//=========================================================================================================
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;
}

Was die Verwendung betrifft, so müsste ich den gesamten Expert Advisor ausnehmen, um ihn zu verstehen...

 
artmedia70:

Mein Code ist eng mit den Daten verbunden, die der Expert Advisor, für den er geschrieben wurde, erhält. Die Funktion ist nur ein Teil der notwendigen Berechnungen und hat keinen praktischen Nutzen für Sie - sie dient lediglich als Anleitung zum Selbstverständnis. Das gilt auch für den Rest des Codes, in dem alle vorläufigen Berechnungen vorgenommen werden.

Wenn ich es universal machen würde, wäre es langsamer, und das will ich nicht... :)

Aber Sie sind willkommen. Diese Funktion wurde von Excel umgeschrieben, wo ich ihre Berechnungen überprüft habe. Ihm werden zwei Parameter übergeben - der Bruch des ZigZag (unterer oder oberer, je nach Art der eröffneten Position) und das Preisniveau 23,6 des Fib. Die Fib wird nicht, wie allgemein üblich, eingezeichnet, aber es wird davon ausgegangen, dass der Preis die 23,6 Fib durchbrochen hat und über dem im Voraus berechneten Konsolidierungsniveau liegt. Der Nullpunkt der Fib wird auf den Bruch in ZZ gelegt, und eine Pose wird am 23.6. eröffnet (wenn sie gebrochen wird). Die verbleibenden Niveaus werden in die auf der globalen Ebene deklarierten Variablen geschrieben und anschließend in das Array der Aufträge eingegeben, aus dem die Niveaus für jede offene Position entnommen werden.

Was die Verwendung betrifft, so sollten Sie den gesamten Expert Advisor ausnehmen, um ihn klar zu machen...

Das ist großartig, du hast mich auf eine Idee gebracht.
 

Hallo zusammen! Bitte helfen Sie mir, die folgenden Dinge zu kombinieren. Das Ergebnis sollte sein: zwei Linien, die dem Kurs folgen, eine um 20 Pips niedriger als Ask..,

Außerdem erhalte ich einen Signalton, wenn sich der Preis um 20 Punkte pro 1 Tick ändert.

Alles funktioniert auch einzeln gut. Vielen Dank im Voraus!

1) Die Linie unterhalb des Ask um 20 Pips.

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

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

2) Die Linie liegt 20 Pips über dem 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) Preisänderungsrate im Zeitverlauf.

#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);
}
 

Können Sie bitte erklären, warum dieser Code manchmal an einer Stelle einfriert und man das Terminal neu starten muss, um ihn fortzusetzen?

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:

Hallo zusammen! Bitte helfen Sie mir, die folgenden Dinge zu kombinieren. Das Ergebnis sollte sein: zwei Linien, die dem Kurs folgen, eine um 20 Pips niedriger als Ask..,

Außerdem erhalte ich einen Signalton, wenn sich der Preis um 20 Punkte pro 1 Tick ändert.

Alles funktioniert auch einzeln gut. Vielen Dank im Voraus!

1) Die Linie unterhalb des Ask um 20 Pips.

2) Die Linie liegt 20 Pips über dem Ask.

3) Preisänderungsrate im Zeitverlauf.


Scheint schon langweilig zu sein... Das ist elementar, Watson:

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

Es ist der Name einer einzigen Zeile.

Tipp: Schlagen Sie den Namen der zweiten Zeile nach. Ist sie anders als die erste?

Ja, und warum sollte man eine bereits gebaute Einrichtung weiterbauen?

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

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

Jetzt sehen Sie den Unterschied:

//+------------------------------------------------------------------+
//| 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);
}

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