Caros usuários do fórum, por favor, me ajudem muito.
if (TimeBar==Tempo[0]) return(0);
double MA1 = NormalizeDouble(iMA(NULL,TimeFrame_2,MA_Period_2,MA_Shift_2,MA_Method_2,Applied_Price_2,0),Digitos); // onde 0 é deslocado da barra atual pelo especificado contagem de períodos para trás //double MA21 = NormalizeDouble(iMA(NULL,timeframe_2,period_2,ma_shift_2,ma_method_2,applied_price_2,2),Digitos); duplo MA2 = NormalizeDuplo(iMA(NULL,timeFrame_3,MA_Period_3,MA_Shift_3,MA_Método_3,Applied_Price_3,0),Dígitos); //douplo MA31 = NormalizeDuplo(iMA(NULL,timeFrame_3,period_3,ma_shift_3,ma_método_3,aplicado_preço_3,2),Dígitos) duplo MA3 = NormalizeDuplo(iMA(NULL,TimeFrame_4,MA_Period_4,MA_Shift_4,MA_Método_4,Applied_Price_4,0),Dígitos);
Com estas condições, o Expert Advisor abre um negócio, digamos, na SELL, fecha-o com lucro, e imediatamente abre outro negócio na SELL. Como prescrever em uma EA, que quando o sinal é recebido, apenas um negócio deve abrir, ou seja, um sinal - um negócio. Agradecemos antecipadamente.
1 variante - ou verificar a condição do negócio de modo que: o índice 2 mostra um sinal de compra e o índice 1 um sinal de venda, então na abertura de um bar com índice 0 abrirá um negócio de venda.
A segunda variante é verificar o histórico de pedidos e comparar o sinal e os índices de pedidos, se coincidirem, então não abrir mais pedidos.
Estou lutando há dois dias e não consigo entender. Preciso encontrar o preço mais baixo para as últimas n barras, mas não da barra atual, mas da barra recebida através da função. A função retorna o índice da barra em que a ordem foi aberta. Esta é a barra da qual precisamos olhar para trás ao longo da história para que as n barras encontrem o preço mais baixo. Abaixo está meu código, o que há de errado com ele?
int n = 10; //баров в глубь истории
index_bar= ND(iLow(Symbol(),0,i)); // начинаем с этого бараdouble val=Low[iLowest(NULL,0,MODE_LOW,n,index_bar)];
Tenho a seguinte pergunta. Como intercepto a roda do mouse, quais funções do winapi? Deixe-me explicar por quê. Há um parâmetro int nos externs. Você precisa girar a roda para aumentá-la ou diminuí-la.
Quando souber como fazer isso, afixe...
Até agora, é assim mesmo que tem funcionado:
#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);
}
O problema é com os ganchos, embora eu tenha resolvido este problema de forma mais simples - se necessário, eu faço minha própria janela de ajustes em uma DLL e lá posso fazer o que eu quiser com os controles do Windows.
Caros usuários do fórum, por favor, me ajudem muito.
if (TimeBar==Tempo[0]) return(0);
double MA1 = NormalizeDouble(iMA(NULL,TimeFrame_2,MA_Period_2,MA_Shift_2,MA_Method_2,Applied_Price_2,0),Digitos); // onde 0 é deslocado da barra atual pelo especificado contagem de períodos para trás
//double MA21 = NormalizeDouble(iMA(NULL,timeframe_2,period_2,ma_shift_2,ma_method_2,applied_price_2,2),Digitos);
duplo MA2 = NormalizeDuplo(iMA(NULL,timeFrame_3,MA_Period_3,MA_Shift_3,MA_Método_3,Applied_Price_3,0),Dígitos);
//douplo MA31 = NormalizeDuplo(iMA(NULL,timeFrame_3,period_3,ma_shift_3,ma_método_3,aplicado_preço_3,2),Dígitos)
duplo MA3 = NormalizeDuplo(iMA(NULL,TimeFrame_4,MA_Period_4,MA_Shift_4,MA_Método_4,Applied_Price_4,0),Dígitos);
duplo OsMA = NormalizeDuplo(iOsMA(NULL,TimeFrame_5,FastEMA_5,SlowEMA_5,SignalSMA_5,Applied_Price_5,0),Dígitos)
if (MaxOrders>b && Low[0]>=MathMax(MA1,MA2)&& Low[0]>MA3 && Ask>MathMax(MA1,MA2)+DeltaOpen*Point && Pergunte>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];
}
retorno(0);
Com estas condições, o Expert Advisor abre um negócio, digamos, na SELL, fecha-o com lucro, e imediatamente abre outro negócio na SELL. Como prescrever em uma EA, que quando o sinal é recebido, apenas um negócio deve abrir, ou seja, um sinal - um negócio.
Agradecemos antecipadamente.
1 variante - ou verificar a condição do negócio de modo que: o índice 2 mostra um sinal de compra e o índice 1 um sinal de venda, então na abertura de um bar com índice 0 abrirá um negócio de venda.
A segunda variante é verificar o histórico de pedidos e comparar o sinal e os índices de pedidos, se coincidirem, então não abrir mais pedidos.
Onde e como a barra de tempo variável é inicializada?
Embora isso não o ajudará muito em seu caso. Eu vejo a variável Comércio nas condições, portanto ajuste a abertura com ela.
Estou lutando há dois dias e não consigo entender. Preciso encontrar o preço mais baixo para as últimas n barras, mas não da barra atual, mas da barra recebida através da função. A função retorna o índice da barra em que a ordem foi aberta. Esta é a barra da qual precisamos olhar para trás ao longo da história para que as n barras encontrem o preço mais baixo. Abaixo está meu código, o que há de errado com ele?
como este
algo como isto.
Muito obrigado! Tentei usar esta função também, mas novamente em um loop, ela se revela simples )))) Mais uma vez, obrigado!
gyfto:
Tenho a seguinte pergunta. Como intercepto a roda do mouse, quais funções do winapi? Deixe-me explicar por quê. Há um parâmetro int nos externs. Você precisa girar a roda para aumentá-la ou diminuí-la.
Quando souber como fazer isso, afixe...
Até agora, é assim mesmo que tem funcionado:
Como Vadim me disse para não usar ganchos de sob o MT4, a plataforma não gosta deles, então eu não os toco. Provavelmente por nada)