Cari utenti del forum, per favore aiutatemi molto.
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); // dove 0 è lo spostamento dalla barra corrente del valore specificato numero di periodi indietro //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);
Con queste condizioni, l'Expert Advisor apre un trade, diciamo, su SELL, lo chiude in profitto, e immediatamente apre un altro trade su SELL. Come prescrivere in un EA, che quando il segnale viene ricevuto, solo una transazione dovrebbe aprirsi, cioè un segnale - una transazione. Grazie in anticipo.
1 variante - o controllare la condizione di accordo in modo che: l'indice 2 mostra un segnale di acquisto e l'indice 1 un segnale di vendita, poi all'apertura di una barra con indice 0 si aprirà un accordo di vendita.
La seconda variante consiste nel controllare la cronologia degli ordini e confrontare gli indici del segnale e dell'ordine, se coincidono, allora non aprire altri ordini.
Sto lottando da due giorni e non riesco a capirlo. Ho bisogno di trovare il prezzo più basso delle ultime n barre, ma non dalla barra corrente, ma dalla barra ricevuta attraverso la funzione. La funzione restituisce l'indice della barra in cui l'ordine è stato aperto. Questa è la barra dalla quale dobbiamo guardare indietro nella storia per le n barre per trovare il prezzo più basso. Qui sotto c'è il mio codice, cosa c'è di sbagliato?
int n = 10; //баров в глубь истории
index_bar= ND(iLow(Symbol(),0,i)); // начинаем с этого бараdouble val=Low[iLowest(NULL,0,MODE_LOW,n,index_bar)];
Ho la seguente domanda. Come posso intercettare la rotella del mouse, quali funzioni winapi? Lasciatemi spiegare perché. C'è un parametro int in externs. È necessario ruotare la ruota per aumentarla o diminuirla.
Quando scoprirete come farlo, postatelo...
Finora è andata così:
#property indicator_chart_window#property indicator_buffers 1#property indicator_color1 RoyalBlue#import "user32.dll"int GetKeyState(int nVirtKey);//обрабочик клавиатуры#importexternint period = 1;
externbool WinAPI = false;//включение-отключение перехвата клавиатуры
externstring s1="Alt+ArrowUp - increment of period";//памятка
externstring s2="Alt+ArrowDown - decrement of period";
externstring 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){
case11:
if(period>1){
period--;
counted_bars = 0;
}
break;
case101:
period++;
counted_bars = 0;
break;
case110:
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);
}
Il problema è con i ganci, anche se ho risolto questo problema in un modo più semplice - se necessario, faccio la mia finestra di impostazioni nella DLL e lì posso fare ciò che voglio con i controlli di Windows.
Cari utenti del forum, per favore aiutatemi molto.
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); // dove 0 è lo spostamento dalla barra corrente del valore specificato numero di periodi indietro
//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)
se (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];
}
ritorno(0);
Con queste condizioni, l'Expert Advisor apre un trade, diciamo, su SELL, lo chiude in profitto, e immediatamente apre un altro trade su SELL. Come prescrivere in un EA, che quando il segnale viene ricevuto, solo una transazione dovrebbe aprirsi, cioè un segnale - una transazione.
Grazie in anticipo.
1 variante - o controllare la condizione di accordo in modo che: l'indice 2 mostra un segnale di acquisto e l'indice 1 un segnale di vendita, poi all'apertura di una barra con indice 0 si aprirà un accordo di vendita.
La seconda variante consiste nel controllare la cronologia degli ordini e confrontare gli indici del segnale e dell'ordine, se coincidono, allora non aprire altri ordini.
Dove e come viene inizializzata la variabile TimeBar?
Anche se non ti aiuterà molto nel tuo caso. Vedo la variabile Trade nelle condizioni, quindi regola l'apertura con essa.
Sto lottando da due giorni e non riesco a capirlo. Ho bisogno di trovare il prezzo più basso delle ultime n barre, ma non dalla barra corrente, ma dalla barra ricevuta attraverso la funzione. La funzione restituisce l'indice della barra in cui l'ordine è stato aperto. Questa è la barra dalla quale dobbiamo guardare indietro nella storia per le n barre per trovare il prezzo più basso. Qui sotto c'è il mio codice, cosa c'è di sbagliato?
come questo
qualcosa del genere.
Grazie mille! Ho provato a usare anche questa funzione, ma di nuovo in un ciclo, risulta essere semplice )))) Grazie ancora!
gyfto:
Ho la seguente domanda. Come posso intercettare la rotella del mouse, quali funzioni winapi? Lasciatemi spiegare perché. C'è un parametro int in externs. È necessario ruotare la ruota per aumentarla o diminuirla.
Quando scoprirete come farlo, postatelo...
Finora è andata così:
Come Vadim mi ha detto di non usare ganci da sotto MT4, alla piattaforma non piacciono, quindi non li tocco. Probabilmente per niente)