Por favor, informe como os seguintes aspectos podem ser implementados:
O preço se move entre 1.9047 e 1.9080 (os números são arbitrários). Se o preço de abertura da próxima vela sair desta faixa - dê um Alerta. Se não - aguarde a próxima vela. E assim até que o preço deixe a faixa.
Agradecemos antecipadamente.
if (Open[0]<1.9047) Alert("Цена ниже заданного диапазона");
if (Open[0]>1.9080) Alert("Цена выше заданного диапазона");
Este é apenas um conceito. Haverá alertas em cada tique se a condição for atendida.
Aqui está um pedaço de código, cujos dados são então utilizados para análise:
if (CurTime() == tm2) //tm1 и tm2 - заданное время
{
//ObjectCreate("line2",OBJ_VLINE,0,tm1,0);
price1=iHigh(Symbol(),PERIOD_M30,1);
//ObjectCreate("highLine",OBJ_HLINE,0,0,price1);
price2=iLow(Symbol(),PERIOD_M30,1);
//ObjectCreate("lowLine",OBJ_HLINE,0,0,price2);
Alert("price1=",price1);
Alert("price2=",price2);
}
ou seja, além disso, o código será parecido com este:
if (Open[0]<price2) Alert("Цена ниже заданного диапазона");
if (Open[0]>price1) Alert("Цена выше заданного диапазона");
E aqui está a pergunta: como e onde devemos colocá-la? Se dentro da condição, nenhum alerta será impresso, e se fora da condição, os alertas serão impressos em cada carrapato.
Peço desculpas por minha pergunta formulada incorretamente.
Aqui está um pedaço de código, cujos dados são então utilizados para análise:
ou seja, além disso, o código será parecido com este:
E aqui está a questão: como e onde devemos colocá-la? Se dentro da condição, nenhum alerta será impresso, e se fora da condição, os alertas serão impressos em cada carrapato.
Peço desculpas por minha pergunta formulada incorretamente.
Se você colocar a condição de verificação de tempo dentro, os alertas de preço só aparecerão se o preço estiver fora dos limites da faixa
Obrigado, acho que já resolvi o problema. Mas mais uma pergunta: agora os alertas são emitidos de um determinado intervalo de tempo e quando o intervalo é excedido até "parar". Há alguma maneira de parar esta "busca" quando o primeiro valor satisfaz a condição?
Atlis: Obrigado, já resolvi o problema. Aqui está outra questão: os alertas são agora gerados a partir de um intervalo de tempo especificado e quando o intervalo é excedido até a "parada". Posso, de alguma forma, parar esta "busca" quando o primeiro valor satisfaz a condição?
Bem, você precisa entender a condição principal que é verdadeira o tempo todo, durante um período de tempo. Por exemplo - comparação de tempos. Após emitir todos os alertas, você precisa atribuir um novo valor à variável com a qual você está comparando a hora atual. Procure por uma função que defina uma nova barra. O conceito de sua construção deve lhe ajudar.
OK, por muito tempo sem resposta, vou lhe dar uma dica: ao retornar o valor verdadeiro da função isCloseLastPosByStop (), retornar mais um valor, que é o tamanho do lote da última posição encontrada.
Como fazer? Passe uma variável para a função por referência, na qual você escreverá o tamanho do lote na própria função. Para fazer isso, você precisará modificar ligeiramente a função éCloseLastPosByStop ()
Se você não entender nada, procure uma função que devolva o tamanho do lote da última posição fechada. Ou você mesmo pode fazer um. E usá-lo, mas isso é mais caro do que passar o valor do lote junto com o verdadeiro
Mudei a função para que ao invés da função True retorne um lote variável, no qual a própria função eu escrevi o tamanho do lote.
2013.10.23 20:57:46 2011.09.22 22:20 WEDNING EURUSD,M5: quantidade de lotes inválidos para a função OrderSend
if(isCloseLastPosByStop ()== lot ) //если последний ордер закрылся по стопу
{
P=lot*2; //открыть ордер объемом = объему закрытому по стопу ордеру умноженному на 2
OrderSend(Symbol(),OP_SELL,P,Bid,1,Ask+1500*Point,Ask-300*Point,"jfh",123 );
}
else //если последний ордер закрылся не по стопу
{
P=0.1;
OrderSend(Symbol(),OP_SELL,1,Bid,P,Ask+1500*Point,Ask-300*Point,"jfh",123 ); //открыть ордер обычным объемом 0.1
}
return(0);
}
//============================================================ bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
datetime t;
double ocp,lot, osl; // добавил переменную - количество лотов в оредереint dg, i, j=-1, k=OrdersHistoryTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderCloseTime()) {
t=OrderCloseTime();
j=i;
}
}
}
}
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
dg=MarketInfo(sy, MODE_DIGITS);
if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
ocp=NormalizeDouble(OrderClosePrice(), dg);
osl=NormalizeDouble(OrderStopLoss(), dg);
if (ocp==osl)
lot=OrderLots( ) ; //добавил вычисление количества лотов в ордере который закрылся по стопу.return(lot); // вместо возвращаемого функцией значения True вставил переменную lot со значением количества лотов
}
return(False);
}
2013.10.23 20:57:46 2011.09.22 22:20 WEDNING EURUSD,M5: quantidade de lotes inválidos para a função OrderSend
Por favor, informe qual é o meu erro.
Obrigado.
A função que determina a última posição fechada por parada tem um tipo bool, enquanto você está tentando retornar o tipo duplo. De forma correspondente, ele retorna 0 ou 1.
Escrevi que deveríamos acrescentar a passagem de uma variável por referência a ela:
//+----------------------------------------------------------------------------+bool isCloseLastPosByStop(string sy, int op, int mn, double &ll) {
double pt;
int t, dg, i, j=-1, k=OrdersHistoryTotal()-1;
for (i=k; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderMagicNumber()!=mn) continue; // если магик не тот, переходим к следующемуif (OrderSymbol()!=sy) continue; // если символ не тот, переходим к следующемуif (OrderType()!=op continue; // если тип не тот, переходим к следующемуif (t<OrderCloseTime()) {
t=OrderCloseTime();
j=i;
}
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
dg=MarketInfo(OrderSymbol(), MODE_DIGITS); // количество знаков в цене символа ордера
pt=MarketInfo(OrderSymbol(), MODE_POINT); // размер пункта инструмента в валюте котировки ордераif (MathAbs(OrderClosePrice()-OrderStopLoss()<0.5*pt)) { // Если закрыт по стопу
ll=OrderLots(); // записываем количество лотов в ордере, закрытом по стопуreturn(true); // возвращаем истину
}
}
return(False); // возвращаем ложь (позиции нету, либо не по стопу)
}
//+----------------------------------------------------------------------------+
Verifique agora a última compra, por exemplo:
//+----------------------------------------------------------------------------+double Lot=MarketInfo(Symbol(), MODE_MINLOT); // задаём минимальное значение переменнойif (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot)) {// в переменную Lot будет записано значение лота закрытой позиции// Если последний закрытый Buy закрыт по стопу
Lot= //... эта переменная содержит размер лота закрытой позиции, выполняете нужные вычисления с этой переменной
}
//+----------------------------------------------------------------------------+
Boa tarde.
Por favor, informe como os seguintes aspectos podem ser implementados:
O preço se move entre 1.9047 e 1.9080 (os números são arbitrários). Se o preço de abertura da próxima vela sair desta faixa - dê um Alerta. Se não - aguarde a próxima vela. E assim até que o preço deixe a faixa.
Agradecemos antecipadamente.
Aqui está um pedaço de código, cujos dados são então utilizados para análise:
ou seja, além disso, o código será parecido com este:
E aqui está a pergunta: como e onde devemos colocá-la? Se dentro da condição, nenhum alerta será impresso, e se fora da condição, os alertas serão impressos em cada carrapato.
Peço desculpas por minha pergunta formulada incorretamente.
Aqui está um pedaço de código, cujos dados são então utilizados para análise:
ou seja, além disso, o código será parecido com este:
E aqui está a questão: como e onde devemos colocá-la? Se dentro da condição, nenhum alerta será impresso, e se fora da condição, os alertas serão impressos em cada carrapato.
Peço desculpas por minha pergunta formulada incorretamente.
Obrigado, já resolvi o problema. Aqui está outra questão: os alertas são agora gerados a partir de um intervalo de tempo especificado e quando o intervalo é excedido até a "parada". Posso, de alguma forma, parar esta "busca" quando o primeiro valor satisfaz a condição?
Bem, você precisa entender a condição principal que é verdadeira o tempo todo, durante um período de tempo. Por exemplo - comparação de tempos. Após emitir todos os alertas, você precisa atribuir um novo valor à variável com a qual você está comparando a hora atual. Procure por uma função que defina uma nova barra. O conceito de sua construção deve lhe ajudar.
Você já leu aqui?
Como saber a distância mínima do mercado para colocar uma ordem pendente?
Como saber a distância mínima do mercado para colocar uma ordem pendente?
int level=MarketInfo(Symbol(), MODE_STOPLEVEL);
se o StopLevel for zero, então muito provavelmente nível=MarketInfo(Symbol(), MODE_SPREAD)*2;
A Alpari usa precisamente a dupla propagação como StopLevel.
Para determinar a distância lida aqui.
Obrigado artmedia70:
OK, por muito tempo sem resposta, vou lhe dar uma dica: ao retornar o valor verdadeiro da função isCloseLastPosByStop (), retornar mais um valor, que é o tamanho do lote da última posição encontrada.
Como fazer? Passe uma variável para a função por referência, na qual você escreverá o tamanho do lote na própria função. Para fazer isso, você precisará modificar ligeiramente a função éCloseLastPosByStop ()
Se você não entender nada, procure uma função que devolva o tamanho do lote da última posição fechada. Ou você mesmo pode fazer um. E usá-lo, mas isso é mais caro do que passar o valor do lote junto com o verdadeiro
Mudei a função para que ao invés da função True retorne um lote variável, no qual a própria função eu escrevi o tamanho do lote.
Tudo se compila, mas as ordens não se abrem:
2013.10.23 20:57:46 2011.02.24 16:25 GMT EURUSD,M5: OrderSend error 4051
2013.10.23 20:57:46 2011.09.22 22:20 WEDNING EURUSD,M5: quantidade de lotes inválidos para a função OrderSend
Por favor, diga-me qual é o meu erro.
Obrigado.
Mudei a função para que ao invés de True a função retorne um lote variável, no qual eu escrevi o tamanho do lote na própria função.
Todas as compilações, mas as ordens não são abertas na revista diz:
2013.10.23 20:57:46 2011.02.24 16:25 EURUSD,M5: OrderSend error 4051
2013.10.23 20:57:46 2011.09.22 22:20 WEDNING EURUSD,M5: quantidade de lotes inválidos para a função OrderSend
Por favor, informe qual é o meu erro.
Obrigado.
A função que determina a última posição fechada por parada tem um tipo bool, enquanto você está tentando retornar o tipo duplo. De forma correspondente, ele retorna 0 ou 1.
Escrevi que deveríamos acrescentar a passagem de uma variável por referência a ela:
Verifique agora a última compra, por exemplo:
Assim...