Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 198

 
Atlis:

Добрый день.

Подскажите, как можно реализовать следующее:

Цена движется в промежутке 1,9047 - 1,9080 (цифры условные). Если цена открытия следующей свечи выходит за данный диапазон - выдать Alert. Если не выходит - ждать следующей свечи. И так до тех пор пока цена не выйдет за диапазон.

Заранее спасибо.


   if (Open[0]<1.9047) Alert("Цена ниже заданного диапазона");
   if (Open[0]>1.9080) Alert("Цена выше заданного диапазона");
Это только концепция. Алерты будут на каждом тике если условие соблюдено.
 

Вот кусок кода данные из которого далее используются для анализа:

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

т.е. дальше код будет выглядеть как:

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

И вот вопрос: как и куда это прописать? Если внутрь условия - вывода алертов нет, а если вне условия - вывод на каждом тике.

Извиняюсь за ранее некорректно сформулированный вопрос.

 
Atlis:

Вот кусок кода данные из которого далее используются для анализа:

т.е. дальше код будет выглядеть как:

И вот вопрос: как и куда это прописать? Если внутрь условия - вывода алертов нет, а если вне условия - вывод на каждом тике.

Извиняюсь за ранее некорректно сформулированный вопрос.

Если поместить внутрь условия проверки времени, то алерты о цене будут появляться только лишь в случае, если цена за пределами ограничений диапазона
 
Спасибо, вроде разобрался. Вот только ещё вопрос: алерты теперь выводятся от заданного временного промежутка и при превышении диапазона до "упора". А можно как-то остановить этот "перебор" при достижении первого значения удовлетворяющего условию?
 
Atlis:
Спасибо, вроде разобрался. Вот только ещё вопрос: алерты теперь выводятся от заданного временного промежутка и при превышении диапазона до "упора". А можно как-то остановить этот "перебор" при достижении первого значения удовлетворяющего условию?

Ну, вам нужно понять главное условие, которое постоянно, на протяжении определённого времени является истинным. Например - сравнение времени. После выдачи всех алертов нужно присвоить новое значение переменной, с которой сверяете текущее время. Поищите функцию определения нового бара. Концепция её построения должна вам помочь.

Вот тут читали?

 

Как узнать минимальное расстояние от рынка для выставления отложенного ордера?

 
Elektronik:

Как узнать минимальное расстояние от рынка для выставления отложенного ордера?

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

если стоплевел равен нулю, то скорее всего level=MarketInfo(Symbol(), MODE_SPREAD)*2;

В Альпари точно в качестве СтопЛевел используется двойной спред.

Для определения дистанции здесь почитайте.

 

Спасибо artmedia70:

 
artmedia70:

ОК, долго не отвечаете, дам подсказку: при возврате значения true из функции isCloseLastPosByStop (), верните ещё одно значение, а именно: размер лота найденной последней позиции.

Как сделать? Передайте в функцию по ссылке переменную, в которую и запишете в самой функции размер лота. Для этого нужно будет чуть изменить функцию isCloseLastPosByStop ()

Если не понятно нифига - ищите функцию, которая вернёт размер лота последней закрытой позиции. Либо сами сделайте. И используйте её, но это затратнее, нежели передать значение лота вместе со значением true

Изменил функцию.Сделал так что вместо True функция возвращает переменную lot,в которую в самой функции я записал размер лота.

Все компилируется,но ордера не открываются.В журнале пишет:

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 ПРЕДЫД СВЕЧА EURUSD,M5: invalid lots amount for OrderSend function

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

Подскажите пожалуйста,в чем моя ошибка.

Спасибо.

 
solnce600:

Изменил функцию.Сделал так что вместо True функция возвращает переменную lot,в которую в самой функции я записал размер лота.

Все компилируется,но ордера не открываются.В журнале пишет:

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 ПРЕДЫД СВЕЧА EURUSD,M5: invalid lots amount for OrderSend function

Подскажите пожалуйста,в чем моя ошибка.

Спасибо.


Функция определения последней закрытой позиции по стопу имеет тип bool, а вы пытаетесь возвращать из неё тип double. Соответственно, она вам возвращает либо 0, либо 1.

Я ж вам писал, что в неё нужно добавить передачу одной переменной по ссылке:

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

Теперь проверяем, например, последнюю Buy:

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

Примерно так...

Причина обращения: