[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 645

 
artmedia70:

Apenas tiene lógica: la simple salida de líneas en orden una tras otra...




Utilizaría funciones para facilitar la comprensión

//--------------------------------------------------------------- 1 --
// Функция вывода на экран графических сообщений.
//--------------------------------------------------------------- 2 --
  int Informations()
  {
   int   Win_ind;                     // Номер окна индикатора
   int   x,y;
   
   trH4     =Trend_PSAR(NULL,240);  // Четырёхчасовой тренд
   trH1     =Trend_PSAR(NULL,60);   // Часовой тренд
   trM30    =Trend_PSAR(NULL,30);   // Получасовой тренд
   trM15    =Trend_PSAR(NULL,15);   // 15-ти минутный тренд

//--------------------------------------------------------------- 3 --
   Win_ind= WindowFind("Info");        // Ищем номер окна индикатора
   if (Win_ind<0)return;               // Если такого окна нет, уходим
//--------------------------------------------------------------- 4 --
   x =10; y =17;
   MyObject("Equ",         x,    y,   "Свободные средства",                   9, "Tahoma", Gold);
   MyObject("EquVal",      x*23, y,   DoubleToStr(Equ_NEW,2),                 9, "Tahoma", Yellow);

//.................................
   WindowRedraw();                      // Перерисовываем все объекты
   return;
  }


void MyObject(string Name, int X, int Y, string Text, int Size, string Srift, color CL){
   if (ObjectFind(Name)==-1)
      ObjectCreate(Name,OBJ_LABEL,1,0,0,0,0);
   ObjectSet(Name,OBJPROP_XDISTANCE,X);
   ObjectSet(Name,OBJPROP_YDISTANCE,Y);
   ObjectSetText(Name, Text, Size, Srift, CL);
}
 
ToLik_SRGV:

Yo también me lo pregunté, pero no encontré nada útil. En cuanto a la optimización, ya conoces el gran freno de iCustom :), en los indicadores hay una restricción en el número de barras, que se puede calcular (a través de IndicatorCounted() o por el número de barras). En el código, no tiene sentido molestarse con el número y la complejidad de las diferentes construcciones como if, while, etc. No ganarás mucho, pero con el tiempo y la experiencia, el código será más "bonito". Bueno, en el modo de visualización, cuando se modela cada "rebote", será lento casi en cualquier caso (dependiendo de la complejidad del sistema, por supuesto). En algún lugar leí que si los cálculos complejos en una dll, será más rápido, pero no lo he comprobado. Con dll, también bastantes matices.

Recuerdo que comandos como TimeCurrent() ralentizaban mucho (cuando hay varios de ellos en el código).

- Es mucho mejor usarlo una vez - ponerlo en una variable, y luego acceder a la variable.

 
Vinin:


Utilizaría las funciones para facilitar la percepción

Sí, claro, Víctor, es mucho más legible. Pero ya estoy intentando, en la medida de lo posible, escribir "de frente" - es muy lento, y en la medida de lo posible, intento ahorrar milisegundos...
 
chief2000:

Recuerdo que comandos como TimeCurrent() son muy lentos (cuando hay varios de ellos en el código)

- Es mucho mejor usarlo una vez - ponerlo en una variable, y luego acceder a la variable.

¡Genial! Vale la pena revisar el código y rehacerlo...
 
chief2000:

Recuerdo que comandos como TimeCurrent() eran muy lentos (cuando había varios de ellos en el código)

- Es mucho mejor utilizarlo una vez, es decir, almacenarlo en una variable y luego acceder a la variable.

¿Cómo puedo configurar correctamente una variable de este tipo para que pueda ser llamada posteriormente?

Primero lo declaro en variables globales

datetime CurTime;

Y luego en start()

Le asigno un valor:

CurTime=TimeCurrent();

y obtengo un error: 'CurTime' - variable esperada.

¿Cómo hacerlo correctamente?

Y otra pregunta: si asigno valores a algunas variables no en start() sino en init(), ¿funcionarán correctamente?

Bueno, me refiero a que algunas funciones, por ejemplo TimeCurrent(), seguirán siendo llamadas en cada tick, si se asigna una variable a esta función al principio de start()

 
¡Qué mal rollo! CurTime da un error, CurrTime no... ¿Cuál es el problema?
 
artmedia70:
¡Qué mal rollo! CurTime da un error y CurrTime no... ¿Qué sentido tiene?
La cuestión es que CurTime es el nombre obsoleto de la función TimeCurrent, por lo que el compilador siempre se queja cuando un nombre de variable coincide con un nombre de función...
 
keekkenen:
La cuestión es que CurTime es el nombre obsoleto de la función TimeCurrent, por lo que cuando un nombre de variable coincide con un nombre de función, el compilador siempre frunce el ceño...
¡Bueno! Gracias, lo sabré en el futuro.
 

Amigos, mi bloque lógico personal está un poco estropeado. No puedo decidir cómo estar en esta situación:

Trabajamos en dos direcciones, es decir, la compra y la venta tienen sus propias unidades de control separadas. Las posiciones pueden abrirse en sentido contrario, todo depende de hacia dónde se mueva el mercado en cada TF.

Supongamos la situación en la que la Venta y la Compra están abiertas (en M5 y M15) y de repente el mercado gira en la dirección opuesta, en contra de la Venta abierta en M5 y M15 (bueno, sea cual sea la situación en el mundo...). En este caso, todas las ventas abiertas empiezan a aumentar mucho el drawdown, y como también tenemos compras abiertas, es posible cerrar algunas posiciones tanto de compra como de venta, para cerrar las ventas deficitarias con pérdidas mínimas a costa de las compras cerradas.

Por lo tanto, no puedo decidir sobre la lógica de esta situación. ¿Qué debería ser?

Por si acaso, he aquí un ejemplo:


 

Buenas personas, volviendo al tema de ayer:

   double c1b[];
   for(i=1;i<=PeriodB;i++)
   {
   c1b[i]=iCCI(NULL,0,PeriodB,PRICE_TYPICAL,i);
   }
   double c1b_1=iMAOnArray(c1b,0,AvgB,0,MODE_SMA,1);
   double c1b_2=iMAOnArray(c1b,0,AvgB,0,MODE_SMA,2);
   double c1b_3=iMAOnArray(c1b,0,AvgB,0,MODE_SMA,3);
   
   double c1s[];
   for(i=1;i<=PeriodS;i++)
   {
   c1s[i]=iCCI(NULL,0,PeriodS,PRICE_TYPICAL,i);
   }
   double c1s_1=iMAOnArray(c1s,0,AvgS,0,MODE_SMA,1);
   double c1s_2=iMAOnArray(c1s,0,AvgS,0,MODE_SMA,2);
   double c1s_3=iMAOnArray(c1s,0,AvgS,0,MODE_SMA,3);

if (NormalizeDouble(c1s_1,4)>NormalizeDouble(c1s_2,4)&&NormalizeDouble(c1s_2,4)<NormalizeDouble(c1s_3,4))
//if (c1s_1>c1s_2&&c1s_2<c1s_3)
     {                                          // 
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
if (NormalizeDouble(c1b_1,4)<NormalizeDouble(c1b_2,4)&&NormalizeDouble(c1b_2,4)>NormalizeDouble(c1b_3,4))
//if (c1b_1<c1b_2&&c1b_2>c1b_3)
     {                                          // 
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }

por favor, dígame qué significa el mensaje del libro de registro:

2010.06.24 17:28:26 TestGenerator: error de datos no coincidentes (límite de volumen 5357 en 2010.01.06 08:00 superado)