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

 
alexpert007 >>:

А вот ещё вопрос Игорю.

Создали ли отдельную пользовательскую (или другую) функцию для переворота позиции бай-на-селл и наоборот, без обычных ОрдерКлоз - ОрдерСенд?

Я не Игорь, но для переворота есть стандартная функция OrderCloseBy.

 

Здраствуйте! Прошу помощи в решении проблемы. Попробую описать:

Есть функция, подсчитывающая ордера:

int OrdersAll(int mag)
{
int kolvo=0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if((OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber() == mag )
kolvo++;
}
}
return(kolvo);
}

Далее в процессе работы, если нет ни одного ордера по текущ. инструменту, при выполнении условия должен выставиться 1 ордер к примеру на покупку, написано так:

if (OrdersAll(MAGICNO)==0)
{
if(условие)
{
op=Ask;if(SL>0){sl=Ask-SL*Point*mn;}if(TP>0){tp=Ask+TP*Point*mn;}
err=OrderSend(Symbol(),OP_BUY,LotsOptimized(),NormalizeDouble(op,Digits),3,NormalizeDouble(sl,Digits),
NormalizeDouble(tp,Digits),"",MAGICNO,0,Blue);
if(err<0)
{
Print("OrderSend()- Ошибка OP_BUY. Ордер не принят. op "+op+" sl "+sl+" tp "+tp+" "+GetLastError());return(-1);
}
}
}

Вместо этого при открытии в терминале к примеру нескольких инструментов и запуске советника в каждом из них, код выше может открыть один ордер - это правильно, но в тоже время он может открыть 20-30 ордеров пока моржа не закончится, если условие продержиться несколько тиков. При работе одним инструментом такого замечено не было пока, но я совсем не уверен, что это не произойдет и на одном инструменте. Как мне исправить мой код, чтобы жестко было открытие не более одного ордера.

 

Игорь, добрый вечер,

Никак не могу справиться с вызовом Вашей функции:

//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Возвращает суммарный профит открытых позиций в валюте депозита |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" - любой символ, |
//| NULL - текущий символ) |
//| op - операция (-1 - любая позиция) |
//| mn - MagicNumber (-1 - любой магик) |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
double p=0;
int i, k=OrdersTotal();

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
}
return(p);
}

Подскажите, в вызове TotOrdProf=GetProfitOpenBuyPosInCurrency(EURUSD, ____, 1);

1. Предположим EURUSD, должно быть в кавычках "EURUSD" или допускается без;

2. Какой должен быть второй параметр вызова (где прочерк), чтобы считалась суммарная прибыль бай и сел (пробовал умолчательную -1; не правильно)

3. Третий параметр является магическим номером эксперта? - до него пока не дошёл, просто вопрос правильно ли я понимаю параметр.

Спасибо.

 

TotOrdProf=GetProfitOpenBuyPosInCurrency("EURUSD",-1, -1);

- только по EURUSD

- все открытые позиции (-1)

- позиции с любым магиком (-1)

 

Добрый день.

Как известно, ф-ция Sleep() не работает в тестере терминала, поэтому для задержки выполнения приходится использовать циклы из математич.ф-ций:

if (IsTesting()==true){for(int z0 = 1; z0 < zFILE*10000;z0++){MathSqrt(MathPow(5,5));MathSqrt(MathPow(5,5));MathSqrt(MathPow(5,5));}}

где zFILE - задержка выполнения эксперта.

Вопрос такой: есть-ли более изящное решение(ф-ция задержки ), так-как задержка необходима от нескольких секунд до 10-20мин (обработка данных внешней программой) ?

Или хотя-бы как поточнее измерить время выполнения ф-ций (т.к. быстродействие процессоров у всех разное ) и подобрать наиболее тормозную ?





 
Piboli >>:

Вопрос такой: есть-ли более изящное решение(ф-ция задержки ), так-как задержка необходима от нескольких секунд до 10-20мин (обработка данных внешней программой) ?

А коллбэки и синхронизаторы пользовать не пробовали?

 

функции Кима

интересно есть функция позволяющая вытаскивать название последнего наброшенного шаблона

и фиксировать изменения его составляющих


 

KimIV может Вы сможете и напишите индикатор 

Индикатор должен искать флатовый канал в течении указаного периода времени и не шире чем указано в настройках

Этот индикатор канал должен искать как в течение суток так и с переходом на следующие сутки как в вашей Функции isTradeTimeInt().
Этот индикатор может за сутки нарисовать 5 каналов а может только один
В настройках задается

extern double      максимальная высота канала в пунктах 
extern int            Bar_Time как будем подщитывать временой интервал в барах(1) или в часах и минутах(2)
extern string        минимальный временой интервал канала в часах в часах и минутах
extern int            минимальный временой интервал канала в барах в барах
extern int            Максимальное количество нарисованых каналов которые остаются нарисоваными

Похожый индикатор прикрепляю  https://www.mql5.com/ru/code  но он рисует канал за строго заданый промежуток времени а не сам ищет такой канал. Он должен искать сам такой канал, который не превышает по высоте максимальную высоту канала и длится не менее чем минимальный временой интервал канала.
Если выбираем Bar_Time по времени канал(1) подщитывается от текущево времени минус время заданое в настройках то есть 2 часа 15 мин или другое заданое время Если теперь 1 час 15 мин то ищет максимум и минимум от 23 часов 00 минут и если максимум минус минимум непревышает максимальная высота канала рисует две линии максимум и минимум протяженостью с 23 :00 до 02 :15. Также рисуется Фибо уровни выше и ниже канала.

Если выбираем Bar_Time по количеству баров канал подщитывается от текущево бара минус заданое количество баров в настройках то есть от нулевого бара до бара нулевой бар минус число заданное в настройках. Если заданное число 50 то будем искать теперь максимум и минимум за 50 последних баров начиная с нулевого бара и если максимум минус минимум непревышает максимальная высота канала рисует две линии максимум и минимум протяженостью 50 баров Также рисуется Фибо уровни выше и ниже канала

Все уровни и данные каанала сохраняются в буферах

 

Вопрос Игорю

Если можно конкретный фрагмент кода эксперта работающего на двух отдельных счетах (Buy Sell ) опрашивающего состояние каждого Account (для расчета размера лота) и имеющего возможность перекачивания депо со счета на счет,а также и имитатор вывода части депо по определенным условиям (допустим месячный или квартальный профит - от него n%)

Уточняю вопрос

1 эксперт работает на Buy (опрашивает состояние счета 2) .. 6200

2 эксперт работает на Sell (опрашивает состояние счета 1) .. 8400

Если нет открытых поз

1100 со счета 2 на счет 1

Счет 1 - 7300

счет 2 - 7300

итого суммарный депозит SD=14600 Максимальный риск - 10% Максимальный лот 0.14

Далее

на 01.04.09 SD=10000

на 01.07.09 SD=14600

Profit=4600

10% = 460

460 выводим на третий счет

Спасибо

 

Уважаемый, Игорь! Выручайте!

Подключил a-SimpleTrailing.mqh.

Добавил что было указано, но вылезают 3 ошибки:

'clModifyBuy' - variable not defined
'clModifySell' - variable not defined
'ti' - variable already defined

Что делать?(



Вот что вместилось:

.........................
   total=OrdersTotal();
   if(total<1)
     {
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("У вас нет денег. Свободные средства = ", AccountFreeMargin());
         return(0);
        }
      if(Hour()>=0)
        {
         chk=1;
         Print("Позиция возможна!");
        }
      if(chk==1)
        {
         if((Low[0]<=MaDert1sell) || (Low[0]<=MaDert2sell))
           {
int ti=OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect(ti, SELECT_BY_TICKET))
ModifyOrder(-1, Ask-30*Point, Bid-99*Point, clModifySell);
            if(ticket>0)
              {
               if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                  Print("Открыт ордер SELL : ",OrderOpenPrice());
               chk=0;
              }
            else
              {
               Print("Ошибка открытия SELL ордера : ",GetLastError());
               return(0);
              }
           }
         if((High[0]>=MaDert1buy) || (High[0]>=MaDert2buy))
           {
int ti=OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect(ti, SELECT_BY_TICKET))
ModifyOrder(-1, Ask-30*Point, Bid-99*Point, clModifyBuy);
            if(ticket>0)
              {
               if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                  Print("Открыт ордер BUY : ",OrderOpenPrice());
               chk=0;
              }
            else
              {
               Print("Ошибка открытия BUY ордера : ",GetLastError());
               return(0);
              }
           }
        }
      return(0);
     }
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // это открытая позиция? OP_BUY или OP_SELL 
         OrderSymbol()==Symbol())  // инструмент совпадает?
        {
         if(OrderType()==OP_BUY)   // открыта длинная позиция
           {
            // проверим, может уже пора закрываться?
            if(Hour()==23)
              {
               chk=0;
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию
               return(0); // выходим
              }
           }
         else // иначе это короткая позиция
           {
            // проверим, может уже пора закрываться?
            if(Hour()==23)
              {
               chk=0;
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // закрываем позицию
               return(0); // выходим
              }

           }
        }
     }
   return(0);
  }

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Модификация одного предварительно выбранного ордера.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена установки ордера                                              |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    cl - цвет значка модификации                                            |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE) {
  bool   fm;
  double op, pa, pb, os, ot;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
 
  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);
 
  if (pp!=op || sl!=os || tp!=ot) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, 0, cl);
      if (fm) {
        if (UseSound) PlaySound(NameFileSound); break;
      } else {
        er=GetLastError();
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it);
        Print("Ask=",pa,"  Bid=",pb,"  sy=",OrderSymbol(),
              "  op="+GetNameOP(OrderType()),"  pp=",pp,"  sl=",sl,"  tp=",tp);
        Sleep(1000*10);
      }
    }
  }
}
//+----------------------------------------------------------------------------+
//|  Возвращает наименование торговой операции                                 |
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
	switch (op) {
		case OP_BUY      : return("Buy");
		case OP_SELL     : return("Sell");
		case OP_BUYLIMIT : return("Buy Limit");
		case OP_SELLLIMIT: return("Sell Limit");
		case OP_BUYSTOP  : return("Buy Stop");
		case OP_SELLSTOP : return("Sell Stop");
		default          : return("Unknown Operation");
	}
}
//+----------------------------------------------------------------------------+
Причина обращения: