Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 64

 
alexey1979621:

Chers utilisateurs du forum, je vous prie de bien vouloir m'aider.


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) ; // où 0 est le décalage de la barre actuelle de la valeur spécifiée. nombre de périodes en arrière
//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)

si (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] ;

}
si (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] ;
}

retour(0) ;


Dans ces conditions, le conseiller expert ouvre une transaction, disons, sur VENTE, la ferme sur un bénéfice, et ouvre immédiatement une autre transaction sur VENTE. Comment prescrire dans un EA, que lorsque le signal est reçu, une seule transaction doit s'ouvrir, c'est-à-dire un signal - une transaction.
Merci d'avance.



1 variante - soit vérifier la condition de la transaction de sorte que : l'indice 2 montre un signal d'achat et l'indice 1 un signal de vente, alors à l'ouverture d'une barre avec l'indice 0 ouvrira une transaction de vente.

La 2ème variante consiste à vérifier l'historique des ordres et à comparer les indices de signaux et d'ordres, s'ils coïncident, alors n'ouvrez plus d'ordres.

 

Où et comment la variable TimeBar est-elle initialisée ?

Bien que cela ne vous aidera pas beaucoup dans votre cas. Je vois la variable commerciale dans les conditions, alors ajustez l'ouverture avec elle.

 
webman1988:

Cela fait deux jours que je me bats et je n'arrive pas à comprendre. J'ai besoin de trouver le prix le plus bas des n dernières barres, mais pas à partir de la barre actuelle, mais à partir de la barre reçue par la fonction. La fonction renvoie l'indice de la barre à laquelle l'ordre a été ouvert. C'est à partir de cette barre qu'il faut remonter dans l'historique des n barres pour trouver le prix le plus bas. Voici mon code, qu'est-ce qui ne va pas ?



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

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

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


quelque chose comme ça.

Merci beaucoup ! J'ai essayé d'utiliser cette fonction aussi, mais encore une fois dans une boucle, elle s'avère être simple )))). Merci encore !
 
FAQ:

gyfto:

J'ai la question suivante. Comment intercepter la molette de la souris, quelles fonctions winapi ? Je vais vous expliquer pourquoi. Il existe un paramètre int dans les externs. Vous devez faire tourner la roue pour l'augmenter ou la diminuer.


Quand vous aurez trouvé comment faire, postez-le...

Jusqu'à présent, c'est comme ça que ça s'est passé :

#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);
}
 
Ce n'est pas intéressant, c'est le détournement de la molette de la souris qui pose problème : https://www.mql5.com/ru/forum/139237.
 
FAQ, j'ai vu ce fil de discussion avant de contacter ce fil, donc je n'ai pas été surpris par votre réaction à la question alors)
.
 
Le problème concerne les crochets, bien que j'aie résolu ce problème d'une manière plus simple - si nécessaire, je crée ma propre fenêtre de paramètres dans la DLL et là, je peux faire ce que je veux avec les contrôles Windows.
 
Comme Vadim m'a dit de ne pas utiliser de crochets sous MT4, la plateforme ne les aime pas, donc je n'y touche pas. Probablement pour rien)
 
gyfto:
Comme Vadim m'a dit de ne pas utiliser de crochets sous MT4, la plateforme ne les aime pas, donc je n'y touche pas. Probablement pour rien)
C'est MT4 lui-même qui n'aime pas les hooks, mais à l'intérieur de celui-ci (à partir de la DLL) vous pouvez appliquer des hooks à d'autres.
Raison: