Полезные функции от KimIV - страница 113

 
togomsk:


Привет!

Почему-то при подключении Вашей библиотеки перестает работать оператор extern, то есть переменные определяются, все нормально компилируется, и в принципе советник работает, но при этом у советника при запуске типа нет ни одного параметра, при том, что параметров довольно много. В чем может быть причина?


Найдите в коде

#property library

И удалите.

 

добавил в эту функцию переменую j, для предпоследних сделок. не работеат как надо зараза. подскажите чё не так.

double GetProfitLastClosePos(string sy="", int op=-1, int mn=-1, int j=0) {
  datetime o;
  double   p=-1;
  int      i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i-j, 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 (o<OrderCloseTime()) {
                o=OrderCloseTime();
                p=OrderProfit();
              }
            }
          }
        }
      }
    }
  }
  return(p);
}
 
abdul1:

добавил в эту функцию переменую j, для предпоследних сделок. не работеат как надо зараза. подскажите чё не так.

Если учитывать, что закрытые ордера учитываются в OrdersHistoryTotal() по времени закрытия справа -> налево (самый последний крайний справа):

double GetProfitLastClosePos (string sy="", int op=-1, int mn=-1,
                              int j=0)          // Искомый (по номеру) ордер от последнего закрытого 
{
    int k = OrdersHistoryTotal(), li_cnt = 0;
//----
    if (sy == "0" || sy == "") sy = Symbol();
    for (int i = k - 1; i >= 0; i--)
    {
        if (!OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) continue;
        if (OrderSymbol() != sy) continue;
        if (OrderType() > 1) continue;
        if (op >= 0) if (OrderType() != op) continue;
        if (mn >= 0) if (OrderMagicNumber() != mn) continue;
        if (j == li_cnt) return (OrderProfit());
        li_cnt++;
    }
//----
    return (-1.0);
}

 Функция возвращает профит j-го от последнего закрытого ордера, "отфильтрованного" по инструменту, Магику, типу. И счёт номеров ведётся от 0-го.

 
TarasBY:

Если учитывать, что закрытые ордера учитываются в OrdersHistoryTotal() по времени закрытия справа -> налево (самый последний крайний справа):

 Функция возвращает профит j-го от последнего закрытого ордера, "отфильтрованного" по инструменту, Магику, типу. И счёт номеров ведётся от 0-го.

то что надо!! благодарю.
 

Всем привет.

Нужна была функция закрытия встречными ордерами одинаковых по лотам ордеров Бай и Селл, когда их прибыль выходит в +. Попытался сделать функцию, но выходит ошибка 4108 (не правильные тикеты)

Не подскажете в чем тут проблема?

//+------------------------------------------------------------------+
int fCloseBu(){
        // Закрываем встречные
  double LotB,LotS,PrB=0,PrS=0;
  int TicketB,TicketS,i, k=OrdersTotal();

  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==Symbol() || Symbol()=="")) {
        if (Magic_N<0 || OrderMagicNumber()==Magic_N) {
        //----------
        if(OrderType()==OP_BUY){
          if (PrB<OrderProfit()+OrderSwap()+OrderCommission()) {
            PrB=OrderProfit()+OrderSwap()+OrderCommission();
            LotB=OrderLots();
            TicketB=OrderTicket();
          }
        }
        if(OrderType()==OP_SELL){
          if (PrS<OrderProfit()+OrderSwap()+OrderCommission()) {
            PrS=OrderProfit()+OrderSwap()+OrderCommission();
            LotS=OrderLots();
            TicketS=OrderTicket();
          }
        }
       if (PrB>0 && PrS>0 && LotB==LotS) {
          OrderCloseBy(TicketB,TicketS,CLR_NONE);
          Print("Закрываем пару встречных ордеров c одинаковыми лотами в плюсе");
          }  
        }
      }
    }
  }
//-------------
   return(0);
}
//+------------------------------------------------------------------+
 
Закрывать ордера надо, когда весь цикл проверок сделан, т.е. после оператора for, а не внутри.
 
подскажите пожалуйста где мне найти советник который работает на пересечениях мувингов с возможностью сдвигать мувинг  в настройках ???
 
Roger:
Закрывать ордера надо, когда весь цикл проверок сделан, т.е. после оператора for, а не внутри.


Спасибо! Если еще кому нужна такая функция - то будет так:

//+------------------------------------------------------------------+
//|    Закрываем встречные                                           |
//+------------------------------------------------------------------+
int fCloseBu(){
  double LotB,LotS,PrB=0,PrS=0;
  int TicketB,TicketS,i, k=OrdersTotal();

  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==Symbol() || Symbol()=="")) {
        if (Magic_N<0 || OrderMagicNumber()==Magic_N) {
        //----------
        if(OrderType()==OP_BUY){
          if (PrB<OrderProfit()+OrderSwap()+OrderCommission()) {
            PrB=OrderProfit()+OrderSwap()+OrderCommission();
            LotB=OrderLots();
            TicketB=OrderTicket();
          }
        }
        if(OrderType()==OP_SELL){
          if (PrS<OrderProfit()+OrderSwap()+OrderCommission()) {
            PrS=OrderProfit()+OrderSwap()+OrderCommission();
            LotS=OrderLots();
            TicketS=OrderTicket();
             }
           }
         }
       }
     }
   }//for
   if(PrB>0 && PrS>0 && LotB==LotS) {
     OrderCloseBy(TicketB,TicketS,CLR_NONE);
     Print("Закрываем пару встречных ордеров c одинаковыми лотами в плюсе");
  }
//-------------
   return(0);
}
//+------------------------------------------------------------------+
 
А какие нибудь видеоуроки по этому языку есть?
 
Andrei5:
А какие нибудь видеоуроки по этому языку есть?
Есть книга. Можно почитать через сайт или скачать себе на комп. Поищите выше  ->"Учебник".