Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 198

 
Atlis:

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.


   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.

 
Atlis:

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.

Você já leu aqui?

 

Como saber a distância mínima do mercado para colocar uma ordem pendente?

 
Elektronik:

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:

 
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

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);
}

Por favor, diga-me qual é o meu erro.

Obrigado.

 
solnce600:

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:

//+----------------------------------------------------------------------------+
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= //... эта переменная содержит размер лота закрытой позиции, выполняете нужные вычисления с этой переменной
   }
//+----------------------------------------------------------------------------+

Assim...

Razão: