Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 324

 

Это верно??

   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер

     {

      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий

      { 

          int OT=OrdersTotal;                   //колличество открытых ордеров в терминале

          double Price=OrderOpenPrice();                   // Цена выбранного ордера

          double Mas [Price][OT];                      //массив для упорядочивания всех ордеров 

или

for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер

     {

      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий

      {

 

          double Price=OrderOpenPrice();                   // Цена выбранного ордера

          double Mas [Price];                      //массив для упорядочивания всех ордеров по цене?

 
vikzip:

Это верно??

   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер

     {

      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий

      { 

          int OT=OrdersTotal;                   //колличество открытых ордеров в терминале

          double Price=OrderOpenPrice();                   // Цена выбранного ордера

          double Mas [Price][OT];                      //массив для упорядочивания всех ордеров 

или

for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер

     {

      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий

      {

 

          double Price=OrderOpenPrice();                   // Цена выбранного ордера

          double Mas [Price];                      //массив для упорядочивания всех ордеров по цене?

1. OrdersTotal возвращает общее количество ордеров, но нумеруются они с нуля. Поэтому цикл должен быть i < OrdersTotal()

2. Массив должен быть заранее объявлен double Mas[];. При удачном выборе ордера размер массива надо увеличивать, ведь мы не знаем сколько их всего...

3. В квадратных скобках должен быть индекс строки массива. Mas[i] = Price;

В результате оба варианта неправильны.

 
Alexey Viktorov:

1. OrdersTotal возвращает общее количество ордеров, но нумеруются они с нуля. Поэтому цикл должен быть i < OrdersTotal()

2. Массив должен быть заранее объявлен double Mas[];. При удачном выборе ордера размер массива надо увеличивать, ведь мы не знаем сколько их всего...

3. В квадратных скобках должен быть индекс строки массива. Mas[i] = Price;

В результате оба варианта неправильны.


Огромное спасибо!

 
Alexey Viktorov:

1. OrdersTotal возвращает общее количество ордеров, но нумеруются они с нуля. Поэтому цикл должен быть i < OrdersTotal()

2. Массив должен быть заранее объявлен double Mas[];. При удачном выборе ордера размер массива надо увеличивать, ведь мы не знаем сколько их всего...

3. В квадратных скобках должен быть индекс строки массива. Mas[i] = Price;

В результате оба варианта неправильны.


А в этом случае будет одномерный массив из цен ордеров?

double Price=OrderOpenPrice();               // Цена выбранного ордера

  double Mas[i] = Price;                      //массив для упорядочивания всех ордеров

  for(int i=1; i<OrdersTotal();)          // Цикл перебора ордер

     {

      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий

      i++;

          }

 
vikzip:

А в этом случае будет одномерный массив из цен ордеров?

double Price=OrderOpenPrice();               // Цена выбранного ордера

  double Mas[i] = Price;                      //массив для упорядочивания всех ордеров

  for(int i=1; i<OrdersTotal();)          // Цикл перебора ордер

     {

      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий

      i++;

          }

Нет. Примерно так.
  double Price;               // Цена выбранного ордера
  double Mas[];                      //массив для упорядочивания всех ордеров
  for(int i=0; i<OrdersTotal(); i++;)          // Цикл перебора ордер
   {
    if(OrderSelect(i,SELECT_BY_POS)==true) // Если есть следующий
     {
      ArrayResize(Mas, ArraySyze()+1);
      Mas[i] = OrderOpenPrice();
// или 
//    Price=OrderOpenPrice();
//    Mas[i] = Price;
     }
   }

Выделенное ==true можно не писать.

 
Alexey Viktorov:
Нет. Примерно так.

Выделенное ==true можно не писать.


Огромное спасибо!

 
Добрый день, есть строчка выбора  профита в валюте. Я хочу 1) чтобы в настройках советника был выбор либо фикс профит ( как уже есть) либо часть от депозита в процентах. Подскажите пожалуйста, как это сделать.
Изначальная строчка вот:

Extern double  profit =10; 

2) сделать так чтобы авторасчет профита  включался, отключался по выбранной цифре аккаунтбаланс. 

Итог:
 профит: фикс/авторасчет 
Фикс - сумма. 
Авторасчет - процент баланса 
Включить авторасчет - с прибыли в %
Выключить авторасчет - с убытка в %
Выбор значения с которого будет считаться прибыль/убыток авторасчета-
 
 

Привет. Подскажите как избавится от закрытия и открытия отложенного ордера на каждом баре? Нужно чтобы открылось и ждало пока не откроется соответствующий ордер.

//+------------------------------------------------------------------+
//|                                                e-News-Lucky$.mq4 |
//|                                                   Lucky$ & KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//|   24.10.2005                                                     |
//| Выставление ордеров в определённое время на пробой диапазона.    |
//| Если ни один ордер не сработал, то модификация на каждом баре.   |
//+------------------------------------------------------------------+
#property copyright "Lucky$ & KimIV"
#property link      "http://www.kimiv.ru"
#define   MAGIC     123

//------- Внешние параметры советника --------------------------------
extern string _Parameters_Trade = "----- Параметры торговли";
extern double Lots           = 0.01;     // Размер торгуемого лота
extern int    StopLoss       = 0;      // Размер фиксированного стопа
extern int    TakeProfit     = 0;       // Размер фиксированного тэйка
extern string TimeSetOrders  = "10:30"; // Время установки ордеров
extern string TimeDelOrders  = "22:30"; // Время удаления ордеров
extern string TimeClosePos   = "22:30"; // Время закрытия позиций
extern int    DistanceSet    = 200;      // Расстояние от рынка
extern bool   UseTrailing    = True;    // Использовать трал
extern bool   ProfitTrailing = True;    // Тралить только профит
extern int    TrailingStop   = 25;      // Фиксированный размер трала
extern int    TrailingStep   = 5;       // Шаг трала
extern int    Slippage       = 3;       // Проскальзывание цены

extern string _Parameters_Expert = "----- Параметры советника";
extern string Name_Expert   = "e-News-Lucky$";
extern bool   UseSound      = True;         // Использовать звуковой сигнал
extern string NameFileSound = "expert.wav"; // Наименование звукового файла
extern color  clOpenBuy     = LightBlue;    // Цвет открытия покупки
extern color  clOpenSell    = LightCoral;   // Цвет открытия продажи
extern color  clModifyBuy   = Aqua;         // Цвет модификации покупки
extern color  clModifySell  = Tomato;       // Цвет модификации продажи
extern color  clCloseBuy    = Blue;         // Цвет закрытия покупки
extern color  clCloseSell   = Red;          // Цвет закрытия продажи

//---- Глобальные переменные советника -------------------------------
int prevBar;

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
void deinit() {
  Comment("");
}

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start() {
  if (TimeToStr(CurTime(), TIME_MINUTES)==TimeSetOrders) SetOrders();
  if (prevBar!=Bars && ExistOrder(1) && ExistOrder(2)) ModifyOrders();
  DeleteOppositeOrders();
  TrailingPositions();
  if (TimeToStr(CurTime(), TIME_DATE)==TimeDelOrders) DeleteAllOrders();
  if (TimeToStr(CurTime(), TIME_MINUTES)==TimeClosePos) CloseAllPositions();
  prevBar=Bars;
}

//+------------------------------------------------------------------+
//| Установка ордеров                                                |
//+------------------------------------------------------------------+
void SetOrders() {
  double ldStop=0, ldTake=0;
  int    spr=MarketInfo(Symbol(), MODE_SPREAD);
  double pAsk=Ask+(DistanceSet+spr)*Point;
  double pBid=Bid-DistanceSet*Point;

  if (!ExistOrder(1)) {
    if (StopLoss!=0) ldStop=pAsk-StopLoss*Point;
    if (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point;
    SetOrder(OP_BUYSTOP, pAsk, ldStop, ldTake, 1);
  }
  if (!ExistOrder(2)) {
    if (StopLoss!=0) ldStop=pBid+StopLoss*Point;
    if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point;
    SetOrder(OP_SELLSTOP, pBid, ldStop, ldTake, 2);
  }
}

//+------------------------------------------------------------------+
//| Модификация ордеров                                              |
//+------------------------------------------------------------------+
void ModifyOrders() {
bool ret;
  double ldStop=0, ldTake=0;
  int    spr=MarketInfo(Symbol(), MODE_SPREAD);
  double pAsk=Ask+(DistanceSet+spr)*Point;
  double pBid=Bid-DistanceSet*Point;

  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC+1) {
        if (StopLoss!=0) ldStop=pAsk-StopLoss*Point;
        if (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point;
        ret=OrderModify(OrderTicket(), pAsk, ldStop, ldTake, 0, clModifyBuy);
      }
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC+2) {
        if (StopLoss!=0) ldStop=pBid+StopLoss*Point;
        if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point;
        ret=OrderModify(OrderTicket(), pBid, ldStop, ldTake, 0, clModifySell);
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Возвращает флаг существования ордера или позиции по номеру       |
//+------------------------------------------------------------------+
bool ExistOrder(int mn) {
  bool Exist=False;
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC+mn) {
        Exist=True; break;
      }
    }
  }
  return(Exist);
}

//+------------------------------------------------------------------+
//| Возвращает флаг существования позиции по номеру                  |
//+------------------------------------------------------------------+
bool ExistPosition(int mn) {
  bool Exist=False;
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC+mn) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          Exist=True; break;
        }
      }
    }
  }
  return(Exist);
}

//+------------------------------------------------------------------+
//| Установка ордера                                                 |
//| Параметры:                                                       |
//|   op     - операция                                              |
//|   pp     - цена                                                  |
//|   ldStop - уровень стоп                                          |
//|   ldTake - уровень тейк                                          |
//|   mn     - добавить к MAGIC                                      |
//+------------------------------------------------------------------+
void SetOrder(int op, double pp, double ldStop, double ldTake, int mn) {
  bool ret;
  color  clOpen;
  string lsComm=GetCommentForOrder();

  if (op==OP_BUYSTOP) clOpen=clOpenBuy;
  else clOpen=clOpenSell;
  ret=OrderSend(Symbol(),op,Lots,pp,Slippage,ldStop,ldTake,lsComm,MAGIC+mn,0,clOpen);
  if (UseSound) PlaySound(NameFileSound);
}

//+------------------------------------------------------------------+
//| Генерирует и возвращает строку коментария для ордера или позиции |
//+------------------------------------------------------------------+
string GetCommentForOrder() {
  return(Name_Expert);
}

//+------------------------------------------------------------------+
//| Удаление всех ордеров                                            |
//+------------------------------------------------------------------+
void DeleteAllOrders() {
  bool fd;
  for (int i=OrdersTotal()-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderMagicNumber()>MAGIC && OrderMagicNumber()<=MAGIC+2) {
        if (OrderSymbol()==Symbol()) {
          if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) {
            fd=OrderDelete(OrderTicket());
            if (fd && UseSound) PlaySound(NameFileSound);
          }
        }
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Закрытие всех позиций по рыночной цене                           |
//+------------------------------------------------------------------+
void CloseAllPositions() {
  bool fc;
  for (int i=OrdersTotal()-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderMagicNumber()>MAGIC && OrderMagicNumber()<=MAGIC+2) {
        if (OrderSymbol()==Symbol()) {
          fc=False;
          if (OrderType()==OP_BUY) {
            fc=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, clCloseBuy);
          }
          if (OrderType()==OP_SELL) {
            fc=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, clCloseSell);
          }
          if (fc && UseSound) PlaySound(NameFileSound);
        }
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Удаление противоположных ордеров                                 |
//+------------------------------------------------------------------+
void DeleteOppositeOrders() {
  bool fd, fep1, fep2;

  fep1=ExistPosition(1);
  fep2=ExistPosition(2);

  for (int i=OrdersTotal()-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol()) {
        fd=False;
        if (OrderType()==OP_BUYSTOP && OrderMagicNumber()==MAGIC+1) {
          if (fep2) fd=OrderDelete(OrderTicket());
        }
        if (OrderType()==OP_SELLSTOP && OrderMagicNumber()==MAGIC+2) {
          if (fep1) fd=OrderDelete(OrderTicket());
        }
        if (fd && UseSound) PlaySound(NameFileSound);
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Сопровождение позиции простым тралом                             |
//+------------------------------------------------------------------+
void TrailingPositions() {
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderMagicNumber()>MAGIC && OrderMagicNumber()<=MAGIC+2) {
        if (OrderSymbol()==Symbol()) {
          if (OrderType()==OP_BUY) {
            if (!ProfitTrailing || (Bid-OrderOpenPrice())>TrailingStop*Point) {
              if (OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*Point) {
                ModifyStopLoss(Bid-TrailingStop*Point, clModifyBuy);
              }
            }
          }
          if (OrderType()==OP_SELL) {
            if (!ProfitTrailing || OrderOpenPrice()-Ask>TrailingStop*Point) {
              if (OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss()==0) {
                ModifyStopLoss(Ask+TrailingStop*Point, clModifySell);
              }
            }
          }
        }
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Перенос уровня StopLoss                                          |
//| Параметры:                                                       |
//|   ldStopLoss - уровень StopLoss                                  |
//|   clModify   - цвет модификации                                  |
//+------------------------------------------------------------------+
void ModifyStopLoss(double ldStop, color clModify) {
  bool   fm;
  double ldOpen=OrderOpenPrice();
  double ldTake=OrderTakeProfit();

  fm=OrderModify(OrderTicket(), ldOpen, ldStop, ldTake, 0, clModify);
  if (fm && UseSound) PlaySound(NameFileSound);
}
//+------------------------------------------------------------------+

 

Здравствуйте. Здесь кто нибудь использует в работе индикаторы от ClasterDelta? есть вопрос по автоматическому использованию данных с индикатора VolumeProfile. Дело в том, что этот индикатор ничего не возвращает, а только рисует гистограмму из трендовых линий. Но при наведении курсора на эту линию, появляется значение объема, проторгованного по данному тику. Как бы эту информацию вытащить из индюка!

Какие есть мысли?

 

Как я уже раньше сталкивался изучая классы, так и опять появляется нюансы которые не описаны в статях или где-то так спрятаны что не возможно найти через поисковик. Целы день потрачен в пустую искал пояснения. Например что означает этот символ и как он влияют если нету. Как видно ниже в примере из стати, сначала он есть а потом нету: &

   // Для int. Проверка существования в массиве элемента с заданным значением
   int Find(int &aArray[],int aValue)
     {
      for(int i=0; i<ArraySize(aArray); i++) 
        {
         if(aArray[i]==aValue) 
           {
            return(i); // Элемент существует, возвращаем индекс элемента
           }
        }
      return(-1); // Нет такого элемента, возвращаем -1
     }

Также этот символ не понятно что означает: ~

   // Конструктор
                     CName() { Alert("Конструктор"); }
   // Деструктор
                    ~CName() { Alert("Деструктор"); }

*

CInfo *returnInfo()
  {
   CInfo *i = new CInfo();
   i.symbol=_Symbol;

   return i;
  }
Причина обращения: