[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No podría ir a ningún sitio sin ti - 2. - página 232

 
drknn:


Es necesario solicitar mediante programación el precio del nivel. Para ello, debe tener el objeto "Fibo" puesto en un gráfico y configurado (todo ello de forma programática). No es tan fácil como puede parecer a primera vista. Sin embargo, los dioses no queman la vajilla. Una vez tuve que jugar con los niveles de Fibo. Y ahora estoy trabajando con el procesamiento de estos niveles. En general, si quieres, puedes resolverlo.

Aquí hay un ejemplo de código para crear un Fibo en un gráfico.

Tuve que hacer una subrutina para solicitar el precio del nivel. Aquí está (si quieres, puedes averiguarlo)

Es decir, deberíamos añadir programáticamente el objeto Fibonacci al abanico de Fibonacci y averiguar el precio del nivel sólo de esa manera. ¿Lo he entendido bien?
 
fury2006:
En otras palabras, tenemos que añadir el objeto Fibonacci al vector Fibonacci y averiguar el precio del nivel sólo así. ¿Lo he entendido bien?
No es necesario adjuntar un objeto Fibo estándar al gráfico. Puede calcular simplemente de forma programada todos los niveles de Fibo teniendo en cuenta las condiciones existentes,
introdúzcalos en variables o en una matriz y compare el precio con estos niveles calculados por usted. Eso es exactamente lo que hago... Aunque - todo esto es IMHO.
 
artmedia70:
No es necesario poner un objeto Fibo estándar en el gráfico. Puede calcular simplemente de forma programada todos los niveles de Fibo basándose en las condiciones existentes,
ponlos en variables o en un array y compara el precio con estos niveles que has calculado. Eso es exactamente lo que hago... Aunque - todo esto es IMHO.
¿Puede escribir un ejemplo de código?
 
fury2006:
¿Puede escribir un ejemplo de código?
Es más complicado que el que te ofreció Vladimir... :))
 
artmedia70:
Y es más complicado que el que sugirió Vladimir... :))
Puede que me guste más :) Además, no es conveniente tener objetos adicionales en la pantalla, ya que habrá muchos de todos modos y los innecesarios sólo estorbarán.
 
fury2006:
Bueno, tal vez me guste más :) Y además, no quiero objetos adicionales en la pantalla. Ya habrá bastantes, y los innecesarios sólo entorpecerán

Mi código está estrechamente ligado a los datos obtenidos por el Asesor Experto para el que fue escrito. La función es sólo una parte de los cálculos necesarios y no tendrá ningún valor práctico para usted, sólo como un tutorial para la autocomprensión. Y eso es con el resto del código, donde se hacen todos los cálculos preliminares.

Si lo hiciera universal, funcionaría más lentamente, pero no quiero eso... :)

Pero de nada. Esta función fue reescrita desde Excel, donde comprobé sus cálculos. Se le pasan dos parámetros - la ruptura del ZigZag (inferior o superior, dependiendo del tipo de posición abierta) y el nivel de precio 23,6 del fib. El fib no está trazado como es generalmente aceptado, pero se considera que el precio ha roto el fib de 23,6 y está por encima del nivel de consolidación calculado de antemano. El cero del fib se coloca en la ruptura de ZZ, y se abre una pose en 23,6 (cuando se rompe). Los niveles restantes se escriben en las variables declaradas en el nivel global y posteriormente se introducen en la matriz de las órdenes, de las que se toman los niveles para cualquier posición abierta.

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

En cuanto a su uso, tendría que destripar todo el Asesor Experto para entenderlo...

 
artmedia70:

Mi código está estrechamente ligado a los datos obtenidos por el Asesor Experto para el que fue escrito. La función es sólo una parte de los cálculos necesarios y no tendrá ningún valor práctico para usted, sólo como un tutorial para la autocomprensión. Y eso es junto con el resto del código, donde se hacen todos los cálculos preliminares.

Si lo hiciera universal, sería más lento, y no quiero eso... :)

Pero de nada. Esta función está reescrita desde Excel, donde comprobé sus cálculos. Se le pasan dos parámetros - la ruptura del ZigZag (inferior o superior, dependiendo del tipo de posición abierta) y el nivel de precio 23,6 del fib. El fib no está trazado como es generalmente aceptado, pero se considera que el precio ha roto el fib de 23,6 y está por encima del nivel de consolidación calculado de antemano. El cero del fib se coloca en la ruptura de ZZ, y se abre una pose en 23,6 (cuando se rompe). Los niveles restantes se escriben en las variables declaradas en el nivel global y posteriormente se introducen en la matriz de las órdenes, de las que se toman los niveles para cualquier posición abierta.

En cuanto a cómo utilizarlo, deberías destripar todo el Asesor Experto para que quede claro...

Eso es genial, me has dado una idea.
 

Hola a todos. Por favor, ayúdame a combinar las siguientes cosas. El resultado debería ser: dos líneas siguiendo el precio, una más baja que Ask por 20 pips..,

el otro es más alto. Además, recibo un pitido si el precio cambia 20 puntos por 1 tick.

Todo funciona bien por separado. Gracias de antemano.

1) La línea por debajo del Ask por 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 línea está 20 pips por encima del 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) Tasa de variación de los precios en el tiempo.

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

¿Puedes explicar por qué este código a veces se congela en un lugar y tienes que reiniciar el terminal para reanudarlo?

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:

Hola a todos. Por favor, ayúdame a combinar las siguientes cosas. El resultado debería ser: dos líneas siguiendo el precio, una más baja que Ask por 20 pips..,

el otro es más alto. Además, recibo un pitido si el precio cambia 20 puntos por 1 tick.

Todo funciona bien por separado. Gracias de antemano.

1) La línea por debajo del Ask por 20 pips.

2) La línea está 20 pips por encima del Ask.

3) Tasa de variación de los precios en el tiempo.


Parece que ya es aburrido... Es elemental, Watson:

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

Es el nombre de una sola línea.

Pista: busca el nombre de la segunda línea. ¿Es diferente de la primera?

Sí, ¿y por qué seguir construyendo una instalación ya construida?

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

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

Ahora mira la diferencia:

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

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