Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 484

 
Amigos, tengo más bien una pregunta sobre la configuración de la señal.
El problema es el siguiente: cuando se cierran los pedidos del proveedor, los pedidos del abonado siguen retenidos. Al parecer, por la diferencia en la difusión. ¿Cómo debo hacer para que los tratos de un Suscriptor se cierren inmediatamente cuando se cierran en el del Proveedor? ¿Qué configuración hay que cambiar?
 
Leo59:
Gracias Alexey!!!! por 4))))

Así que... encontré mi viejo pavo y recorté lo que necesitaba de él. No lo escribiré por ti)), pero servirá para empezar. He añadido comentarios allí, los nombres de las variables están claros en los nombres.

datetime date[]; // тут будем хранить данные времени баров, которые видны на экране
// если нужны другие данные баров, заводим соотв. массивы 

void DoWork(bool redrawAll = false)
{
    int visibleBars = 1, firstVisibleBars = 0;
    visibleBars = (int)ChartGetInteger(0, CHART_VISIBLE_BARS);
    firstVisibleBars = (int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
    
    ArrayResize(date, visibleBars + 10); // выделяем память с запасом

    // так можно узнать масштаб графика, может пригодится
    int scale = (int)ChartGetInteger(0, CHART_SCALE);
    // копируем данные времен баров 
    if (CopyTime(Symbol(), Period(), startpos, visibleBars, date) == -1)
    {
        Print("Не удалось скопировать значения времени! Код ошибки = ", GetLastError());
        return;
    }

    //--- определим шаг, если надо работать с масштабом
    int step = 1;
    switch (scale)
    {
    case 0:
        step = 12;
        break;
    case 1:
        step = 6;
        break;
    case 2:
        step = 4;
        break;
    case 3:
        step = 2;
        break;
    }
    double priceMin = ChartGetDouble(0,CHART_PRICE_MIN,0);
    double priceMax = ChartGetDouble(0,CHART_PRICE_MAX,0);

    for (int i = visibleBars - 1; i >= 0; i--)
    {
        /*
        проходимся по всем видимым барам и ищем стрелки, искать можно путями:
        1. Изначально при создании стрелок надо формировать имена стрелок с привязкой ко времени, например
        string name = "UpArrow"  + IntegerToString(TimeCurrent());
        тогда тупо ищем стрелку с таким именем и далее двигаем, куда надо
        2. Заносить стрелки в структуры и класть их в хештаблицу, первый проще
        */
    }
    
}
 
Artem Prischepa:
Amigos míos, tengo una pregunta más sobre el ajuste de la señal.
El problema es el siguiente: cuando se cierran los pedidos de un Proveedor, siguen estando en el del Abonado. Al parecer, por la diferencia en la difusión. ¿Cómo debo hacer para que los tratos de un Suscriptor se cierren inmediatamente cuando se cierran en el del Proveedor? ¿Qué configuración hay que cambiar?

El acuerdo también debería cerrarse casi al instante. Preguntas:

  1. ¿Está el terminal del abonado encendido en este momento?
  2. Por favor, adjunte el archivo de registro del terminal para el día del problema.
 
Alexey Volchanskiy:

Así que... encontré mi viejo pavo y recorté lo que necesitaba de él. No lo escribiré por ti)), pero servirá para empezar. He añadido comentarios allí, los nombres de las variables están claros en los nombres.

Además, probablemente debería poner el número de subventana del indicador en esta línea? No sé exactamente lo que se necesita

ChartGetDouble(0,CHART_PRICE_MIN,0);
 
Alexey Volchanskiy:

Además, probablemente debería poner el número de subventana del indicador en esta línea. No sé exactamente lo que se necesita

Oooops, despistado esta mañana, no copié el manejo de eventos del gráfico en el código

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
    if(id == CHARTEVENT_CHART_CHANGE)
    {
        DoWork(true);
        ChartRedraw();
    }    
}
 
Alexey Volchanskiy:

Así que... encontré mi viejo pavo y recorté lo que necesitaba de él. No lo escribiré por ti)), pero servirá para empezar. He añadido comentarios allí, los nombres de las variables están claros por los nombres.

¡Gracias Alexey por tu ayuda!

¿Y dónde fijar el paso, y en general su funcionalidad, sobre qué?

    //--- определим шаг, если надо работать с масштабом
    int step = 1;

Y esto:

        2. Заносить стрелки в структуры и класть их в хештаблицу, первый проще

Nunca lo he hecho. Si puedes, por favor, dame un ejemplo de código, para que pueda entenderlo, comprenderlo y aplicarlo.

 
Alexey Volchanskiy:

Oooops, despistado esta mañana, no copié el manejo de eventos de la gráfica en el código

Ojalá tuviera tu despiste junto con tus conocimientos))
Es bastante fácil cuando se sabe. Sólo hay que aporrear las teclas, siempre que se tengan ganas y medios para hacerlo.
Y cuando no lo sabes y estás indagando... eso es un dolor de cabeza... Y si hay más pistas, estás jodido, sin ningún nervio.
¡¡¡¡Así que gracias por los consejos!!!!
 
Leo59:
Gracias Alexey por tu ayuda.

¿En qué punto del terreno de juego, y de su funcionalidad en general, te equivocas?

Y esto:

Nunca lo he hecho. Si puedes, por favor, dame un ejemplo de código, para que pueda entenderlo, comprenderlo y utilizarlo.

Cuando comprimimos el gráfico horizontalmente (teclas +/-), cambia la escala y a veces los objetos gráficos pueden superponerse. He citado este código por si acaso, cómo determinar la escala.

No citaré el código con hash - no lo tengo, sólo se me ocurrió. Es mejor hacer la variante 1, es más simple.

En cuanto a los conocimientos - aconsejo a todos los que estudian, que lean la ayuda con tranquilidad, que salten por las secciones, donde está todo. Es decir, no empollar, yo era tan empollador, para nada. Sólo tienes que saber, al menos aproximadamente, que hay tal y tal... al menos secciones/sub-secciones. Entonces, cuando surjan las preguntas, los engranajes girarán en tu cabeza y surgirá una dirección de búsqueda. En principio, la ayuda no es perfecta, pero está bien, hay muchos ejemplos.

Como el lenguaje en sí es sencillo, no es difícil de aprender. Surgen dificultades con la API, dónde buscar qué y cómo aplicarla

 
¡Hola!

A primera vista, la tarea parece tan sencilla como tres céntimos. PERO! ....
Hay una línea de cualquier oscilador en la ventana del indicador, que se menea con respecto a "0" con diferente amplitud.
El problema real es:
- En el cruce "0" de abajo a arriba, dibuje una flecha en el borde inferior de la ventana del indicador,
- En el "0" cruzando desde arriba hacia abajo, para dibujar una flecha cerca del borde superior de la ventana del indicador,
- en el autoescalado del gráfico del oscilador en la ventana del indicador, las flechas deberían permanecer automáticamente en sus bordes de la ventana del indicador.
Es decir, al desplazar el gráfico hacia adelante y hacia atrás por el historial, o al cambiar su escala horizontal, las flechas deberían permanecer siempre en los límites de la ventana del indicador de forma automática.

Por favor, no des consejos, "ayúdame económicamente")). Por favor, adjunte el código fuente de dicha función, o enlace a la misma.

Gracias de antemano.
 

Por favor, ayúdenme a entender.

Necesito encontrar el máximo drawdown en cada (que sea) día (la escritura en el archivo ocurre una vez al día) - terminal MT4.

La reducción máxima es la distancia en el gráfico desde el pico hasta la reducción de fondos actual y la reducción de fondos es la pérdida actual.

He escrito el siguiente código

   if(Analiz_Prosadki==true)
     {
      if(ContolSavaTXT==1)
        {
         ProfitNew=0;
         ProfitMin=0;
         ContolSavaTXT=0;
        }

      if(ContolSavaTXT==0)
        {
         ProfitNew=AccountInfoDouble(ACCOUNT_PROFIT);
         BalansNew==AccountInfoDouble(ACCOUNT_BALANCE);  //Текузее значение баланса
         if (BalansNew>BalansMax) BalansMax=BalansNew;
         if (ProfitNew<ProfitMin && BalansNew>=BalansMax) ProfitMin=ProfitNew;
         if (ProfitNew<ProfitMin && BalansNew<BalansMax) ProfitMin=ProfitNew-(BalansMax-BalansNew);
        }

      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitMin);   // Пишем информацию в файл - функция возвращает 1
     }

Sin embargo, es correcto en algunos gráficos e incorrecto en otros. Al mismo tiempo, los gráficos son visualmente iguales.

Debo haber cometido un error en el código o en la lógica, pero no puedo entender de qué tipo.