Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 198

 
Atlis:

Buon pomeriggio.

Si prega di consigliare come può essere implementato quanto segue:

Il prezzo si muove tra 1,9047 e 1,9080 (le cifre sono arbitrarie). Se il prezzo di apertura della prossima candela si muove fuori da questo range - emetti un Alert. Se non lo fa - aspetta la prossima candela. E così fino a quando il prezzo non lascia la gamma.

Grazie in anticipo.


   if (Open[0]<1.9047) Alert("Цена ниже заданного диапазона");
   if (Open[0]>1.9080) Alert("Цена выше заданного диапазона");
Questo è solo un concetto. Ci saranno avvisi su ogni tick se la condizione è soddisfatta.
 

Ecco un pezzo di codice, i cui dati vengono poi utilizzati per l'analisi:

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

cioè più avanti il codice sarà simile a questo:

 if (Open[0]<price2) Alert("Цена ниже заданного диапазона");
 if (Open[0]>price1) Alert("Цена выше заданного диапазона");

Ed ecco la domanda: come e dove metterlo? Se all'interno della condizione, non verrà stampato alcun avviso, e se al di fuori della condizione, gli avvisi verranno stampati su ogni tick.

Mi scuso per la mia domanda formulata in modo scorretto.

 
Atlis:

Ecco un pezzo di codice, i cui dati vengono poi utilizzati per l'analisi:

cioè più avanti il codice sarà simile a questo:

Ed ecco la domanda: come e dove metterlo? Se all'interno della condizione, non verrà stampato alcun avviso, e se al di fuori della condizione, gli avvisi verranno stampati su ogni tick.

Mi scuso per la mia domanda formulata in modo scorretto.

Se metti la condizione di controllo del tempo all'interno, gli avvisi di prezzo appariranno solo se il prezzo è fuori dai limiti dell'intervallo
 
Grazie, penso di aver risolto il problema. Ma un'altra domanda: ora gli avvisi vengono emessi a partire da un determinato intervallo di tempo e quando l'intervallo viene superato fino a "stop". C'è un modo per fermare questa "ricerca" quando il primo valore soddisfa la condizione?
 
Atlis:
Grazie, ho risolto il problema. Ecco un'altra domanda: gli avvisi sono ora generati a partire da un intervallo di tempo specificato e quando l'intervallo viene superato fino allo "stop". Posso in qualche modo fermare questa "ricerca" quando il primo valore soddisfa la condizione?

Bene, bisogna capire la condizione principale che è vera sempre, per un periodo di tempo. Per esempio, un confronto temporale. Dopo aver emesso tutti gli avvisi, è necessario assegnare un nuovo valore alla variabile con cui si sta confrontando il tempo corrente. Cercate una funzione che definisca una nuova barra. Il concetto della sua costruzione dovrebbe aiutarvi.

L'avete letto qui?

 

Come faccio a sapere la distanza minima dal mercato per piazzare un ordine pendente?

 
Elektronik:

Come faccio a sapere la distanza minima dal mercato per piazzare un ordine pendente?

int level=MarketInfo(Symbol(), MODE_STOPLEVEL);

se lo StopLevel è zero, allora molto probabilmente level=MarketInfo(Symbol(), MODE_SPREAD)*2;

Alpari usa precisamente il doppio spread come StopLevel.

Per determinare la distanza leggi qui.

 

Grazie artmedia70:

 
artmedia70:

OK, da molto tempo senza risposta, ti darò un suggerimento: quando restituisci il valore vero dalla funzione isCloseLastPosByStop (), restituisci un altro valore, che è la dimensione del lotto dell'ultima posizione trovata.

Come fare? Passate una variabile nella funzione per riferimento, in cui scriverete la dimensione del lotto nella funzione stessa. Per fare questo, dovrete modificare leggermente la funzione isCloseLastPosByStop ()

Se non ci capite niente, cercate una funzione che restituisca la dimensione del lotto dell'ultima posizione chiusa. Oppure potete farne uno voi stessi. E usarlo, ma è più costoso che passare il valore del lotto insieme a true

Ho cambiato la funzione in modo che invece di True la funzione restituisce un lotto variabile, in cui la funzione stessa ho scritto la dimensione del lotto.

Tutto si compila, ma gli ordini non si aprono:

2013.10.23 20:57:46 2011.02.24 16:25 GMT EURUSD,M5: OrderSend errore 4051

2013.10.23 20:57:46 2011.09.22 22:20 WEDNING EURUSD,M5: importo lotti non valido per la funzione 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);
}

Per favore, ditemi qual è il mio errore.

Grazie.

 
solnce600:

Ho cambiato la funzione in modo che invece di True la funzione restituisca un lotto variabile, in cui ho scritto la dimensione del lotto nella funzione stessa.

Tutto si compila, ma gli ordini non vengono aperti nel giornale dice:

2013.10.23 20:57:46 2011.02.24 16:25 PM EURUSD,M5: OrderSend errore 4051

2013.10.23 20:57:46 2011.09.22 22:20 WEDNING EURUSD,M5: importo lotti non valido per la funzione OrderSend

Per favore consigliatemi qual è il mio errore.

Grazie.


La funzione che determina l'ultima posizione chiusa da stop ha un tipo bool, mentre tu stai cercando di restituire il tipo double. Corrispondentemente, restituisce o 0 o 1.

Ho scritto che dovremmo aggiungere il passaggio di una variabile per riferimento:

//+----------------------------------------------------------------------------+
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);                                     // возвращаем ложь (позиции нету, либо не по стопу)
}
//+----------------------------------------------------------------------------+

Ora controlla l'ultimo Buy, per esempio:

//+----------------------------------------------------------------------------+
double Lot=MarketInfo(Symbol(), MODE_MINLOT);            // задаём минимальное значение переменной
if (isCloseLastPosByStop(Symbol(), OP_BUY, Magic, Lot)) {// в переменную Lot будет записано значение лота закрытой позиции
   // Если последний закрытый Buy закрыт по стопу
   Lot= //... эта переменная содержит размер лота закрытой позиции, выполняете нужные вычисления с этой переменной
   }
//+----------------------------------------------------------------------------+

Come questo...