[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 299

 
palomnik:

//-----------------------------------------------------------------------------+
//Kim ¡Respeto y respeto!! |
//+----------------------------------------------------------------------------+

Esta fue sin duda la parte más estresante del código ))))

De acuerdo. No entiendo nada. Tengo la segunda TF en funcionamiento. Todo debería funcionar como un reloj. Pero no es así. No, está funcionando, pero no es como se esperaba. Lo he comprobado mil veces. Yo mismo no veo ningún error sintáctico o algorítmico. Intentaré explicarlo, adjunto el código completo. Así que:

Δtime=TimeCurrent()-time;//перестраховка на случай, если TimeCurrent() во время выполнения цикла изменится
switch(Δtime){
  case 0 ://если секунда не прошла
    AccumulatorOfTicks(false);//заносим в массив-накопитель
    break;
  case 1 ://если прошла ОДНА секунда после последнего тика
    WriteBar();//по предыдущему тику рисуем свечу
    AccumulatorOfTicks(true);//и ловим текущий тик
    break;
  default://если прошло НЕСКОЛЬКО секунд после последнего тика
    WriteBar();//по предыдущему тику рисуем свечу
    Δtime--; time++;//уменьшаем разницу на единицу, т.к. свечу уже нарисовали
    while(Δtime!=0) WriteDash();//и рисуем прочерки по кол-ву пропущ. сек. минус один
    AccumulatorOfTicks(true);//ловим текущий тик
}

Al principio de start() pongo un manejador para el número de segundos transcurridos desde el último start(). Las secciones repetidas se han trasladado a funciones definidas por el usuario. El nuevo valor time=TimeCurrent() se asigna allí, en las funciones de usuario.

void AccumulatorOfTicks(bool AtFirst){
        if (AtFirst){
                ArrayResize(bid, 1);//урезаем использованные массивы
                ArrayResize(ask, 1);
                i=0;//обнуляем счётчик тиков в секунду
                time=TimeCurrent();//приводим счётчик времени к текущему
        }else{
                ArrayResize(bid, i+1);
                ArrayResize(ask, i+1);
                i++;
        }
        bid[i]=MarketInfo(symbol, MODE_BID);
        ask[i]=MarketInfo(symbol, MODE_ASK);
        if (bid[i]==ask[i]) Alert("from accumulator: bid=ask");
}

La función trabaja en dos modos: en la primera rama, AtFirst=true, sólo capta un tick y pone a cero previamente el array-almacenamiento, mientras que en la segunda rama, AtFirst=false, funciona exactamente como un almacén de tick. Es decir, o bien ponemos a cero y truncamos la unidad y cogemos la oferta y la demanda en una celda cero, o bien alargamos la unidad y cogemos la oferta y la demanda. La alerta se estableció sólo con fines de depuración. Más adelante describiré la condición de puesta a cero del acumulador.

void WriteBar(){
        if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                //проверяем, переместилось-не переместилось, это я убрал, т.к. к вопросу не относится.
        }else{
                FileWriteInteger(hand1e,  time,   LONG_VALUE);//TimeCurrent()
                FileWriteDouble (hand1e,  bid[0], DOUBLE_VALUE);//Open[]
                FileWriteDouble (hand1e,  bid[ArrayMaximum(bid)], DOUBLE_VALUE);//High[]
                FileWriteDouble (hand1e,  ask[ArrayMinimum(ask)], DOUBLE_VALUE);//Low[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]
                FileWriteDouble (hand1e,  ArraySize(ask), DOUBLE_VALUE);//Volume[]
                FileFlush       (hand1e);
                fpos = FileTell (hand1e);//запоминаем позицию записи в файле
                if(ArraySize(ask)==2) Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " - volume = ", ArraySize(ask)));
                if(bid[0]==ask[ArraySize(ask)-1]) Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " - bid=ask, Ticks = ", ArraySize(ask)));
                /*Необходимое пояснение. Хотя код рассчитан в т.ч. на тени свечей (т.е. независимыми от Open и Close
                 High и Low), в реальности их на чарте не будет, т.к. в секунде максимум 2 тика, три тика в секунде
                я ещё не встречал. Поэтому в массиве из двух элементов (т.е. двух тиков)
                один будет максимумом, другой минимумом, - и невольно совпадать с Open и Close.*/
        }
}

La función de "dibujar" la vela (añadir una vela a .hst abierta en el gráfico autónomo). Del mismo modo, pongo alertas para la depuración. La primera alerta señala a dos ticks capturados en un segundo (el tamaño del array es igual a dos, y en idea el volumen debería ser igual a dos), mientras que la segunda señala al bit igual a ack en el tick capturado (alerta similar en drive: pero funcionan de forma no sincronizada por alguna razón), y el volumen de la vela. Todo esto es en teoría, de hecho, cuando se introduce en el archivo (por alerta), por ejemplo, dos (o 0x00 00 00 00 00 00 40, doble 2,0) de alguna manera todavía resulta ser uno (0x00 00 00 00 F0 3F, doble 1,0 en formato BigEndian). Suelo anular esa alerta en el variador, pita a menudo, trabajo con estos dos.

void WriteDash(){
        if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                //аналогично убрал, т.к. к вопросу не относится.
        }else{//ставим прочерк на Close[0]
                Δtime--; time++;
                FileWriteInteger(hand1e,  time,   LONG_VALUE);//TimeCurrent()
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Open[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//High[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Low[]
                FileWriteDouble (hand1e,  ask[ArraySize(ask)-1], DOUBLE_VALUE);//Close[]
                FileWriteDouble (hand1e,  0, DOUBLE_VALUE);//Volume[]
                FileFlush       (hand1e);
                fpos = FileTell (hand1e);//запоминаем позицию записи в файле
        }
}

La función "dibuja" una raya en caso de que no haya habido ningún tick en qué segundo. Funciona según el siguiente algoritmo:

Δtime=0: captura (copia) de ticks.

Δtime=1: Dibuja un candelabro en el tic que fue capturado antes, luego captura el tic (con un acumulador preliminarmente puesto a cero).

Δtime>1: Dibuja una vela en el tick capturado antes, dibuja guiones en la línea Close[0] en la cantidad deΔtime-1, captura un tick (con acumulador preliminarmente a cero). En todos los casos, el acumulador debe ponerse a cero cuando ya se ha dibujado una vela en él y significa que el acumulador ya no es necesario. Esto ocurre cuandoΔtime>0.

Vamos a repasarlo:

Con la flecha he dibujado los momentos en los que la oferta es supuestamente igual al asc y el volumen debería ser supuestamente igual a uno. No capturé el fondo con volúmenes, de todas formas no se ve nada ahí, es poco profundo. Pero todos están nivelados, es decir, o bien cero o bien uno, ninguno sube a dos (aunque la alerta está señalando). Dos garrapatas por segundo - todavía en un ratón hover irónicamente muestra el volumen = 1, y la oferta es igual a asku también irónicamente muestra el volumen = 0. ¿Por qué? Entiendo que en algún lugar hay un error, pero lo más probable es que no me dé cuenta del error, o que busque en el lugar equivocado. Adjunto el código, he comentado bien mi parte del código, he comprobado las sangrías por todas partes, he eliminado los inluders, sólo he seleccionado las funciones a utilizar, para que compile más rápido. La única observación - no funciona fuera de línea, es decir, con TimeLocal, a diferencia de colector de garrapatas original, porque he escrito en if(tickTimeLocal==true) allí desde el principio (ya que no lo necesitaba mucho). Intenté traducirlo en Expert Advisor siguiendo el consejo de Taras - las velas no se muestran en el gráfico autónomo (pero la línea de la cotización actual se mueve bien).

Archivos adjuntos:
fif.ta.mq4  18 kb
 
artmedia70:

tus zapatillas.

Deberías recibir un spoiler de la administración. He empezado a notar que el calzado no comentado no se convierte en menos calzado por alguna razón))
 

Hola

He aquí una pregunta. Digamos que hoy es lunes. Necesito saber el precio de cierre del viernes. Necesito saber el precio de cierre del viernes.

iClose(NULL, Period_D1, 1)
Hice esta pregunta porque veo las barras del sábado y del domingo en el Probador de Estrategias. No he negociado en estos días. ¿Sobre la línea escrita está el precio de cierre del viernes o del domingo?
 
gince:

Hola

He aquí una pregunta. Digamos que hoy es lunes. Necesito saber el precio de cierre del viernes. ¿Puedo escribir

Tengo esta pregunta porque en el Probador de Estrategias veo barras en sábado y domingo. No negocio en esos días. ¿La línea escrita arriba da el precio de cierre del viernes o del domingo?

¡Dame el precio del viernes! Si el servidor cierra no más tarde de las 24.00 horas del viernes y comienza no antes de las 0.00 horas del domingo

Utilice el indicador DailyPivotPoints.

 

No, no lo entiendo en absoluto. Claramente ya está escribiendo

                switch(ArraySize(ask)){
                 case 0: FileWriteDouble(hand1e,  0.0, DOUBLE_VALUE); Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " 0")); break;
                 case 1: FileWriteDouble(hand1e,  1.0, DOUBLE_VALUE); Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " 1")); break;
                 case 2: FileWriteDouble(hand1e,  2.0, DOUBLE_VALUE); Alert(StringConcatenate(TimeToStr(TimeCurrent(), TIME_SECONDS), " 2")); break;
                 default: Alert("!!!!! - ", ArraySize(ask));
                }

En las alertas iguales a 2, saco el indicador de los minutos, arrastro el ratón sobre la vela... Volumen=1.

Mirado RateInfo en hst a través de FileInsight (como depurador), creo que tal vez hay int, pero no doble en el volumen - no, el mismo doble ...

 

Buenas noches.

Gracias por la respuesta a mi pregunta))

Por favor, dígame si coloco una orden de compra como esta OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0, "Buy",0,0,Green);

Si es una orden de ventaOrderSend (Symbol(),OP_SELL,Lot,Ask,3,0,0, "Sell",0,0,Red);


¿la diferencia es azul o tiene que cambiar también el color rojo? es decir, donde OP_BUY es el precio de la oferta

donde OP_SELL tiene el precio de venta

También quería comprobar si mi orden no ha cambiado y no quería cambiarla, así que por qué está bien en el Probador de Estrategias, pero en el REAL "Error al abrir la orden 129" - ¡por favor, ayuda!

 
ed3sss:

Buenas noches.

Gracias por la respuesta a mi pregunta))

Por favor, dígame si coloco una orden de compra como esta OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0, "Buy",0,0,Green);

Si es una orden de ventaOrderSend (Symbol(),OP_SELL,Lot,Ask,3,0,0, "Sell",0,0,Red);

¿la diferencia es azul o tiene que cambiar también el color rojo? es decir, donde OP_BUY es el precio de la oferta

donde OP_SELL tiene el precio de venta

También quería comprobar si mi orden no ha cambiado y no quería cambiarla, ¿por qué todo fue bien en el Probador de Estrategias y en la Demo, pero me dio un error de 129 cuando intenté abrirla en el Mercado REAL?

¡Si abres Compra, en Ascenso, si Vendes en Oferta! Y cerrar al revés.
 
ed3sss:

Buenas noches.

Gracias por responder a mi pregunta))

Me pueden decir si abro una orden de compra como esta OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0, "Buy",0,0,Green);

Si es una orden de ventaOrderSend (Symbol(),OP_SELL,Lot,Ask,3,0,0, "Sell",0,0,Red);

...
En la compra:
OrderSend (Symbol(),OP_BUY,Lot,Ask,3,0,0,"Покупка",0,0,Green);

Vender:

OrderSend (Symbol(),OP_SELL,Lot,Bid,3,0,0,"Продажа",0,0,Red);

Recomiendo actualizar los presupuestos antes de enviar un pedido:

RefreshRates();
OrderSend (...);
Y tenga en cuenta que su deslizamiento =3, para cotizaciones de 4 dígitos será =3 pips y para cotizaciones de 5 dígitos se calculará como 0,3 pips. Así que si su EA va a trabajar con cotizaciones de 5 dígitos, entonces establezca slipage = 30.
 
gyfto:

No, no lo entiendo en absoluto. Claramente ya está escribiendo

En las alertas iguales a 2, saco el indicador de los minutos, arrastro el ratón sobre la vela... Volumen=1.

Mirado RateInfo en hst a través de FileInsight (como depurador), creo que tal vez hay int, pero no doble en el volumen - no, el mismo doble ...

He mirado su código.... Lo tienes todo demasiado confundido))))

No entiendo muy bien, por qué necesitamos acumular ticks, porque es suficiente almacenar en la memoria (o incluso no almacenar, porque la barra actual debe ser escrita en HST - de lo contrario el gráfico no se actualizará) los parámetros de la barra actual - seis números TOHLCV, y actualizarlos según sea necesario en la recepción de ticks, y hacer el corte de la barra en la condición especificada(TimeCurrent()-O>1).

Intenta rehacer el código de esta manera, se reducirá en 8 veces, te lo garantizo (lo he comprobado:)

 
He intentado comprobar un indicador, pongo los números en el gráfico pero no cambian, intentaré ponerlo de otra manera, necesito que el indicador adjunto fije el precio como una cruz que se sitúe en un zigzag o alerta o impresión pero se congela en la conexión.
Archivos adjuntos: