Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 64

 
alexey1979621:

Estimados usuarios del foro, por favor ayúdenme mucho.


if (TimeBar==Time[0]) return(0);


double MA1 = NormalizeDouble(iMA(NULL,TimeFrame_2,MA_Period_2,MA_Shift_2,MA_Method_2,Applied_Price_2,0),Digits); // donde 0 es el desplazamiento de la barra actual por el número de períodos atrás
//double MA21 = NormalizeDouble(iMA(NULL,timeframe_2,period_2,ma_shift_2,ma_method_2,applied_price_2,2),Digits);
double MA2 = NormalizeDouble(iMA(NULL,timeFrame_3,MA_Period_3,MA_Shift_3,MA_Method_3,Applied_Price_3,0),Digits);
//double MA31 = NormalizeDouble(iMA(NULL,timeframe_3,period_3,ma_shift_3,ma_method_3,applied_price_3,2),Digits)
double MA3 = NormalizeDouble(iMA(NULL,TimeFrame_4,MA_Period_4,MA_Shift_4,MA_Method_4,Applied_Price_4,0),Digits);

double OsMA = NormalizeDouble(iOsMA(NULL,TimeFrame_5,FastEMA_5,SlowEMA_5,SignalSMA_5,Applied_Price_5,0),Digits)

if (MaxOrders>b && Low[0]>=MathMax(MA1,MA2)&& Low[0]>MA3 && Ask>MathMax(MA1,MA2)+DeltaOpen*Point && Ask>MA3 && MA2<MA3 && MA1<MA3 && OsMA>0 && Trade)
{
if (OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),Slippage,SL,TP, "Puria_1",Magic,0,Blue) ==-1) TimeBar=0;
else TimeBar=Time[0];

}
if (MaxOrders>s && High[0]<=MathMin(MA1,MA2) && High[0]<MA3 && Bid<MathMin(MA1,MA2)-DeltaOpen*Point && Bid<MA3 && MA1>MA3 && MA2>MA3 && OsMA<0 && Trade)
{
if (OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),Slippage,SL,TP, "Puria_1",Magic,0,Red) ==-1) TimeBar=0;
else TimeBar=Time[0];
}

return(0);


Con estas condiciones, el Asesor Experto abre una operación, digamos, de VENTA, la cierra con ganancias, e inmediatamente abre otra operación de VENTA. Cómo prescribir en un EA, que cuando se recibe la señal, sólo se debe abrir una operación, es decir, una señal - una operación.
Gracias de antemano.



1 variante - o bien comprueba la condición de la operación para que: el índice 2 muestre una señal de compra y el índice 1 una señal de venta, entonces en la apertura de una barra con índice 0 abrirá una operación de venta.

La segunda variante es comprobar el historial de órdenes y comparar los índices de señales y de órdenes, si son iguales, entonces no abra más órdenes.

 

¿Dónde y cómo se inicializa la variable TimeBar?

Aunque en tu caso no te servirá de mucho. Veo la variable Comercio en las condiciones, así que ajusta la apertura con ella.

 
webman1988:

Llevo dos días luchando y no consigo resolverlo. Necesito encontrar el precio más bajo de las últimas n barras, pero no de la barra actual, sino de la barra recibida a través de la función. La función devuelve el índice de la barra en la que se abrió la orden. Esta es la barra a partir de la cual tenemos que buscar en el historial las n barras para encontrar el precio más bajo. Abajo está mi código, ¿qué tiene de malo?



int n = 10;  //баров в глубь истории 

index_bar= ND(iLow(Symbol(),0,i)); // начинаем с этого бара

double val=Low[iLowest(NULL,0,MODE_LOW,n,index_bar)];
así
 
r772ra:


algo así.

¡Muchas gracias! Intenté usar esta función también, pero de nuevo en un bucle, resulta ser simple )))) Gracias de nuevo.
 
FAQ:

gifto:

Tengo la siguiente pregunta. ¿Cómo puedo interceptar la rueda del ratón, qué funciones winapi? Déjeme explicarle por qué. Hay un parámetro int en los externos. Tienes que girar la rueda para aumentar o disminuirla.


Cuando descubras cómo hacerlo, publícalo...

Hasta ahora, así es como ha funcionado:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 RoyalBlue
#import "user32.dll"
        int GetKeyState(int nVirtKey);//обрабочик клавиатуры
#import

extern int       period = 1;
extern bool      WinAPI = false;//включение-отключение перехвата клавиатуры
extern string    s1="Alt+ArrowUp - increment of period";//памятка
extern string    s2="Alt+ArrowDown - decrement of period";
extern string    s3="Alt+Home - period=1";

double SMA[];
int Alt, ArrowUp, ArrowDown, Home;

int init(){
    SetIndexStyle(0,DRAW_LINE);
    SetIndexBuffer(0,SMA);
    if(WinAPI){//запоминаем состояние клавиш
        Alt = GetKeyState(18);
        ArrowUp = GetKeyState(38);
        ArrowDown = GetKeyState(40);
        Home = GetKeyState(36);
    }
    return(0);
}

int deinit(){
    if(WinAPI) Comment(" ");
    return(0);
}

int start(){
    if(WinAPI){//ставим сконденсированный флаг и снова запоминаем состояние клавиш НА КАЖДОМ ТИКЕ
        int flag = ((Alt!=GetKeyState(18)) && Home==GetKeyState(36)) + 10*((Alt!=GetKeyState(18)) && (ArrowUp==GetKeyState(38))) + 100*((Alt!=GetKeyState(18)) && (ArrowDown==GetKeyState(40)));
        Alt = GetKeyState(18);
        ArrowUp = GetKeyState(38);
                ArrowDown = GetKeyState(40);
        Home = GetKeyState(36);
    }
    int    counted_bars=IndicatorCounted();
    if(WinAPI){//разводка сконденсированного флага; перед limit, чтобы отсюда эмулировать прикрепление к графику
        switch(flag){
            case 11: 
                    if(period>1){
                            period--; 
                            counted_bars = 0;
                    } 
                    break;
            case 101: 
                    period++; 
                    counted_bars = 0; 
                    break;
            case 110: 
                    period=1; 
                    counted_bars = 0;
            }
        }
        int limit = Bars - counted_bars - 1;
        /*Шпаргалка. В первый заход counted_bars = 0, limit = Bars - 1 (номер самого левого БАРа, т.к. считается с нуля)
        на первом тике нулевого бара counted_bars = Bars - 2, limit = 1 (пересчитаем предпоследний БАР)
        на следующих тиках counted_bars = Bars - 1, limit = 0 (нулевой, он же текущий, БАР)*/
        if(WinAPI) Comment("flag=", flag, ", period=", period);//принтуем в коммент для визуализации
        for(int bar=0; bar<=period*(limit/period); bar++){//обычный цикл индикаторов
                SMA[bar] = iMA(NULL, 0, period, 0, MODE_SMA, PRICE_CLOSE, bar);
        }
        return(0);
}
 
No es interesante, el problema es el secuestro de la rueda del ratón : https://www.mql5.com/ru/forum/139237
 
FAQ, vi este hilo antes de contactar con este hilo, así que no me sorprendió tu reacción a la pregunta entonces)
 
El problema es con los hooks, aunque yo lo resolví de una manera más sencilla - si es necesario, hago mi propia ventana de configuración en la DLL y ahí puedo hacer lo que quiera con los controles de Windows.
 
Como Vadim me dijo que no usara ganchos de debajo de MT4, a la plataforma no le gustan, así que no los toco. Probablemente para nada)
 
gyfto:
Como Vadim me dijo que no usara ganchos de debajo de MT4, a la plataforma no le gustan, así que no los toco. Probablemente para nada)
Es la propia MT4 la que no le gustan los hooks, pero desde ella (desde la DLL) se pueden aplicar hooks a otros.