[Archive] Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 2. - page 232

 
drknn:


Vous devez demander par programme le prix du niveau. Pour ce faire, il faut que l'objet "Fibo" soit placé sur un graphique et configuré (tout cela de manière programmatique). Ce n'est pas aussi facile qu'il n'y paraît à première vue. Cependant, les Dieux ne brûlent pas la vaisselle. J'ai dû une fois jouer avec les niveaux Fibo. Et maintenant je travaille avec le traitement de ces niveaux. En général, si vous voulez, vous pouvez vous débrouiller.

Voici un exemple de code pour créer un Fibo sur un graphique.

J'ai dû faire une sous-routine pour demander le prix du niveau. Le voici (vous pouvez le découvrir si vous le souhaitez)

C'est-à-dire que nous devrions ajouter de manière programmatique l'objet Fibonacci à l'éventail Fibonacci et trouver le prix du niveau uniquement de cette manière. Ai-je bien compris ?
 
fury2006:
En d'autres termes, nous devons ajouter l'objet Fibonacci au vecteur Fibonacci et trouver le prix du niveau. Ai-je bien compris ?
Il n'est pas nécessaire d'attacher un objet Fibo standard au graphique. Vous pouvez simplement calculer par programme tous les niveaux de Fibo en tenant compte des conditions existantes,
Entrez-les dans des variables ou un tableau et comparez le prix avec ces niveaux calculés par vous-même. C'est exactement ce que je fais... Bien que - tout ceci soit IMHO.
 
artmedia70:
Il n'est pas nécessaire de placer un objet Fibo standard sur le graphique. Vous pouvez simplement calculer par programme tous les niveaux de Fibo sur la base des conditions existantes,
mettez-les dans des variables ou un tableau et comparez le prix avec ces niveaux que vous avez calculés. C'est exactement ce que je fais... Bien que - tout ceci soit IMHO.
Pouvez-vous rédiger un exemple de code ?
 
fury2006:
Pouvez-vous rédiger un exemple de code ?
C'est plus compliqué que celui que Vladimir a suggéré... :))
 
artmedia70:
Et c'est plus compliqué que celui que Vladimir a suggéré... :))
Je pourrais l'apprécier davantage :) De plus, vous ne voulez pas avoir d'objets supplémentaires à l'écran. Il y en aura beaucoup de toute façon et ceux qui ne sont pas nécessaires ne feront que gêner.
 
fury2006:
Eh bien, peut-être que je l'aimerai plus :) De plus, je ne veux pas d'objets supplémentaires à l'écran. Il y en aura déjà beaucoup et ceux qui sont inutiles ne feront que gêner
.

Mon code est étroitement lié aux données obtenues par le conseiller expert pour lequel il a été écrit. Cette fonction n'est qu'une partie des calculs nécessaires et ne vous sera d'aucune utilité pratique - seulement un tutoriel pour l'auto-compréhension. Et c'est avec le reste du code, où tous les calculs préliminaires sont effectués.

Si je le rendais universel, il fonctionnerait plus lentement, mais je ne veux pas ça... :)

Mais vous êtes le bienvenu. Cette fonction a été réécrite à partir d'Excel, où j'ai vérifié ses calculs. Deux paramètres lui sont passés - la rupture de ZigZag (inférieure ou supérieure, selon le type de position ouverte) et le niveau de prix 23.6 de la fib. La fib n'est pas tracée comme il est généralement admis, mais on considère que le prix a franchi la fib 23.6 et se trouve au-dessus du niveau de consolidation calculé à l'avance. Le zéro de la fib est placé sur la rupture de ZZ, et une pose est ouverte sur 23.6 (lorsqu'elle est rompue). Les niveaux restants sont écrits dans les variables déclarées au niveau global et ensuite introduits dans le tableau des ordres, à partir duquel les niveaux sont pris pour toute position ouverte.

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

Quant à son utilisation, il me faudrait vider tout le Conseiller Expert pour le comprendre...

 
artmedia70:

Mon code est étroitement lié aux données obtenues par le conseiller expert pour lequel il a été écrit. Cette fonction ne représente qu'une partie des calculs nécessaires et ne vous sera d'aucune utilité pratique - juste un tutoriel pour l'autocompréhension. Et c'est avec le reste du code, où tous les calculs préliminaires sont effectués.

Si je le rendais universel, il serait plus lent, et je ne veux pas de ça... :)

Mais vous êtes le bienvenu. Cette fonction est réécrite à partir d'Excel, où j'ai vérifié ses calculs. Deux paramètres lui sont passés - la rupture de ZigZag (inférieure ou supérieure, selon le type de position ouverte) et le niveau de prix 23.6 de la fib. La fib n'est pas tracée comme il est généralement admis, mais on considère que le prix a franchi la fib 23.6 et se trouve au-dessus du niveau de consolidation calculé à l'avance. Le zéro de la fib est placé sur la rupture en ZZ, et une pose est ouverte sur 23.6 (lorsqu'elle est rompue). Les niveaux restants sont écrits dans les variables déclarées au niveau global et ensuite introduits dans le tableau des ordres, à partir duquel les niveaux sont pris pour toute position ouverte.

Quant à la façon de l'utiliser, vous devriez vider l'ensemble du Conseiller Expert pour que ce soit clair...

C'est génial, tu m'as donné une idée.
 

Bonjour à tous ! Veuillez m'aider à combiner les éléments suivants. Le résultat devrait être : deux lignes suivant le prix, une inférieure à Ask de 20 pips..,

l'autre est plus élevé. De plus, je reçois un bip si le prix change de 20 points par 1 tick.

Tout fonctionne bien séparément. Merci d'avance !

1) La ligne en dessous du Ask de 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) La ligne est 20 pips au-dessus de 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) Le taux de variation des prix dans le temps.

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

Pouvez-vous expliquer pourquoi ce code se bloque parfois à un endroit et qu'il faut redémarrer le terminal pour le reprendre ?

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:

Bonjour à tous ! Veuillez m'aider à combiner les éléments suivants. Le résultat devrait être : deux lignes suivant le prix, une inférieure à Ask de 20 pips..,

l'autre est plus élevé. De plus, je reçois un bip si le prix change de 20 points par 1 tick.

Tout fonctionne bien séparément. Merci d'avance !

1) La ligne en dessous du Ask de 20 pips.

2) La ligne est 20 pips au-dessus de l'Ask.

3) Le taux de variation des prix dans le temps.


On dirait que c'est déjà ennuyeux... C'est élémentaire, Watson :

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

C'est le nom d'une seule ligne.

Indice : cherchez le nom de la deuxième ligne. Est-il différent du premier ?

Oui, et pourquoi continuer à construire une installation déjà construite?

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

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

Maintenant, regardez la différence :

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

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