Как одновременно запустить два советника - страница 2

 
Prival:
Я очень часто любуюсь, красотой и эффективностью Ваших процедур. Поверьте очень приятно смотреть на качественную работу.

Благодарю за доброе слово!

Prival:
Если вас не затруднит сделайте 1 страничку с пояснениями к каждой процедуре. Это кирпичики и часто очень хорошего качества, из них можно построить хороший дом. У каждого он будет конечно свой. Но вот многими Вашими кирпичиками я бы воспользовался с удовольстивем если Вы не против.

У меня этих кирпичиков слишком много. Перечислю только перечень групп:

  • для отладки советников индикаторов
  • для двоичных чисел
  • для работы с графическими объектами
  • для работы с индикаторами
  • для работы с ордерами (отдельно для тестов и для торговли на реале)
  • для работы с позициями (отдельно для тестов и для торговли на реале)
  • расчёты размеров лота, стопа
  • различные вспомогательные, сервисные функции

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

 
интересно посмотреть на группу расчёты размеров лота, стопа
 
scorpionk:
интересно посмотреть на группу расчёты размеров лота, стопа

Для лота где-то в кодебейс есть. Ищите по названию b-Lots.
Для стопов:

//+------------------------------------------------------------------+
//|                                                   b-StopLoss.mqh |
//|                                           Ким Игорь В. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//|  15.12.2005  Библиотека функций установки первоначального стопа. |
//+------------------------------------------------------------------+
#property library
 
//------- Внешние параметры модуля -----------------------------------
extern string _Parameters_b_StopLoss = "---------- Параметры модуля StopLoss";
extern int    WayChoiceStop = 0;     // Способ выбора стопа
extern int    StopLoss      = 50;    // Размер фиксированного стопа
extern int    shiftOfBar    = 1;     // Смещение бара
extern int    StopATRPeriod = 5;     // Период ATR
extern double StopATRFactor = 2;     // Коэффициент
 
//+------------------------------------------------------------------+
//| Возвращает уровень StopLoss для ордера или позиции               |
//| Параметры:                                                       |
//|   op - вид операции                                              |
//+------------------------------------------------------------------+
double GetStopLoss(int op) {
  double ldStop=0, ind=0;
  int    shift=shiftOfBar;
 
  if (WayChoiceStop==0 && StopLoss!=0) {         // фиксированный
    if (op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) {
      ldStop=Ask-StopLoss*Point;
    }
    if (op==OP_SELL || op==OP_SELLLIMIT || op==OP_SELLSTOP) {
      ldStop=Bid+StopLoss*Point;
    }
  }
 
  if (WayChoiceStop==1) {                        // фракталы
    if (op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) {
      while (ind==0) {
        ind=iFractals(NULL, 0, MODE_LOWER, shift);
        shift++;
      }
      ldStop=ind-5*Point;
    }
    if (op==OP_SELL || op==OP_SELLLIMIT || op==OP_SELLSTOP) {
      while (ind==0) {
        ind=iFractals(NULL, 0, MODE_UPPER, shift);
        shift++;
      }
      ldStop=ind+MarketInfo(NULL, MODE_SPREAD)+5*Point;
    }
  }
  if (WayChoiceStop==2) {                        // ATR
    ind=iATR(NULL, 0, StopATRPeriod, shift);
    if (op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) {
      ldStop=Low[shift]-StopATRFactor*ind;
    }
    if (op==OP_SELL || op==OP_SELLLIMIT || op==OP_SELLSTOP) {
      ldStop=High[shift]+StopATRFactor*ind;
    }
  }
  return(ldStop);
}
//+------------------------------------------------------------------+
 
KimIV:
ArTrader:
спасиб буду капать))

Моя функция Вам в помощь... :-)

//+----------------------------------------------------------------------------+
//|  Возвращает количество позиций.                                            |
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1 - любая позиция)                    |
//|    mn - MagicNumber                (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;
  if (StringLen(sy)==1 && StringGetChar(sy, 0)==48) sy=Symbol();
 
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) kp++;
          }
        }
      }
    }
  }
  return(kp);
}

Доброе утро всем! Видно совсем я притупил с новогодними праздниками. Надо мне в коде ограничить число позиций с магиком=MagicNum_1, например - тремя позициями. Как мне использовать данную фунуцию? Например , вот здесь:

if (!TrendDetector)   {     //если "ТрендДетектор" выключен
//----------------- сигнал на покупку(Блюдце)------------------
if    (      (iAO(NULL, 0, 0)> 0)&&
      (iAO(NULL, 0, 3)> iAO(NULL, 0, 2)) &&
      (iAO(NULL, 0, 2)< iAO(NULL, 0, 1))  )  {
if NumberOfPositions( А ЗДЕСЬ ЧТО НУЖНО...? ) {//ЕСЛИ ЧИСЛО ОТКРЫТЫХ ПОЗ. НЕ БОЛЕЕ 3-х
  Lots=GetSizeLot();     
  ticket=OrderSend(Symbol(),0,Lots,Ask,3,Bid... ... ...MagicNum_1 ... )
}}}
 
leonid553:
Доброе утро всем! Видно совсем я притупил с новогодними праздниками.
Надо мне в коде ограничить число позиций с магиком=MagicNum_1, например
- тремя позициями...
Пока Игорь отсыпается, влезу со своей корявой функцией. Взято из Moving Average и доделано для удобства.
Примитив, конечно, но позволяет получить отдельно buy, sell и общее количество ордеров.
//+------------------------------------------------------------------+
//| Calculate open positions |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol,int MAGICMA,int mode)
// если mode=1, возвращается число buy ордеров
// если mode=-1, возвращается число sell ордеров
// если mode=0 , возвращается общее количество ордеров
{
int buys=0,sells=0;
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
//---- return orders volume
if(mode==1 ) return(buys);
if(mode==-1) return(sells);
if(mode==0) return(buys+sells);
}
 
leonid553:

Доброе утро всем! Видно совсем я притупил с новогодними праздниками. Надо мне в коде ограничить число позиций с магиком=MagicNum_1, например - тремя позициями. Как мне использовать данную фунуцию? Например , вот здесь:

if NumberOfPositions( А ЗДЕСЬ ЧТО НУЖНО...? ) {//ЕСЛИ ЧИСЛО ОТКРЫТЫХ ПОЗ. НЕ БОЛЕЕ 3-х
  Lots=GetSizeLot();     
  ticket=OrderSend(Symbol(),0,Lots,Ask,3,Bid... ... ...MagicNum_1 ... )
}}}

if ( NumberOfPositions( "", -1, MagicNum_1 ) < 3 ) {//ЕСЛИ ЧИСЛО ОТКРЫТЫХ ПОЗ. НЕ БОЛЕЕ 3-х
  Lots=GetSizeLot();     
  ticket=OrderSend(Symbol(),0,Lots,Ask,3,Bid... ... ...MagicNum_1 ... )
}
 
Vinin:
 total=OrdersTotal();
  if(total<1) 
.......
}

Вот этот кусок текста превращает всю возню с Магиками в бесмылицу.


ArTrader, поясню приведенный ответ пользователя Vinin. Смысл в том, что в советнике 'MACD Sample' стоит ограничение на количество открытых (неважно кем или чем) ордеров, равное 1. Когда один экземпляр советника открывает ордер, то второй экземпляр этого советника на другом графике не будет открывать ордера, пока не закрылся ордер от первого экземпляра советника, поскольку должен открывать позиции только когда количество ордеров меньше 1 (т.е. равно 0):

if(total<1)
Vinin, прошу прощения, что встрял.
 
komposter:
leonid553:

Доброе утро всем! Видно совсем я притупил с новогодними праздниками. Надо мне в коде ограничить число позиций с магиком=MagicNum_1, например - тремя позициями. Как мне использовать данную фунуцию? Например , вот здесь:

if NumberOfPositions( А ЗДЕСЬ ЧТО НУЖНО...? ) {//ЕСЛИ ЧИСЛО ОТКРЫТЫХ ПОЗ. НЕ БОЛЕЕ 3-х
  Lots=GetSizeLot();     
  ticket=OrderSend(Symbol(),0,Lots,Ask,3,Bid... ... ...MagicNum_1 ... )
}}}

if ( NumberOfPositions( "", -1, MagicNum_1 ) < 3 ) {//ЕСЛИ ЧИСЛО ОТКРЫТЫХ ПОЗ. НЕ БОЛЕЕ 3-х
  Lots=GetSizeLot();     
  ticket=OrderSend(Symbol(),0,Lots,Ask,3,Bid... ... ...MagicNum_1 ... )
}

Благодарю, komposter ! Давно уж хотел с этим разобраться. Теперь понял.

Благодарю, также, всех, кто откликнулся...

 
KimIV, любопытно было по посмотреть вашу библиотеку функций. В частности очень интересуют группы:  для работы с ордерами (отдельно для тестов и для торговли на реале) и для работы с позициями (отдельно для тестов и для торговли на реале).
 
Сергей, приглашаю Вас в тему Полезные функции от KimIV.
Причина обращения: