Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Публикуй программы в Маркете. Зарабатывай с помощью своих знаний!
Evgeniy Zhdan
5298
Evgeniy Zhdan 2013.12.10 15:38 
Здравствуйте! Подскажите пожалуйста как написать функцию, которая бы подсчитывала общее количество лотов (один общий размер лота) из открытых советником ордеров. Надо чтобы магик и символ учитывались. Сам не могу додуматься...
Sergey Dzyublik
4788
Sergey Dzyublik 2013.12.10 16:37  
   double TotalPositionT (string symbol="",int magic){
      double total_possition=0;
      if ((symbol=="") || (symbol==0))symbol=Symbol();
      for(int i=OrdersTotal()-1;i>=0;i--){
         if (!OrderSelect(i,0))continue;
         if (OrderMagicNumber()!=magic)continue;
         if (OrderSymbol()!=symbol)continue;
         if (OrderType()<2)total_possition+=OrderLots();
      }
      return (total_possition);
   }

больше нуля - лоты бай, меньше нуля - лоты селл.

Не проверял - так написал, кажись должно работать.

Vitalie Postolache
11960
Vitalie Postolache 2013.12.10 17:32  
ALXIMIKS:

больше нуля - лоты бай, меньше нуля - лоты селл.

Не проверял - так написал, кажись должно работать.

Как лоты могут быть отрицательными?

А так-то, можно без continue:

 double TotalPositionT (string symbol="",int magic)
{
      double total_possition=0;
      if ((symbol=="") || (symbol==0)) symbol=Symbol();
      for(int i=OrdersTotal()-1;i>=0;i--)
{
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if (OrderMagicNumber()==magic && OrderSymbol()==symbol)
          if (OrderType()<2)total_possition+=OrderLots();
}
      return (total_possition);
}
Ahmad Mehdiyev
478
Ahmad Mehdiyev 2013.12.10 22:48  
Функция ALXIMIKSa подсчитает абсолютное число лотов, всех, и buy и sell. То есть если у вас 3 buy и 2 sell то функция выдаст 5. Положительных, отрицательных не будет. Если же вам нужна нет позиция (для хеджирования например) то нужно подсчитать отдельно buy и отдельно sell и найти разницу. А там уже разница будет либо положительная либо отрицательная, по знаку и будете знать каких лотов больше buy или sell, (это уже зависит от того что от чего отнимать). Код у вас почти готов, только дописать надо.
Алексей Тарабанов
7250
Алексей Тарабанов 2013.12.10 22:57  
Нет, работать не будет, если не поменять местами symbol и magic.
Vitalie Postolache
11960
Vitalie Postolache 2013.12.10 23:08  
tara:
Нет, работать не будет, если не поменять местами symbol и magic.

Доказательства будут?
Artyom Trishkin
Модератор
74003
Artyom Trishkin 2013.12.10 23:24  
remon:
Здравствуйте! Подскажите пожалуйста как написать функцию, которая бы подсчитывала общее количество лотов (один общий размер лота) из открытых советником ордеров. Надо чтобы магик и символ учитывались. Сам не могу додуматься...
//+------------------------------------------------------------------+
//|                                             Сумма всех лотов.mq4 |
//|                               Copyright 2013, Artyom A. Trishkin |
//|                       https://www.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, Artyom A. Trishkin"
#property link      "https://www.mql5.com/ru/users/artmedia70"
int    Magic=1234;
double SumLotsB=0;
double SumLotsS=0;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start() {
   int dgl=MathCeil(MathAbs(MathLog(MarketInfo(Symbol(), MODE_MINLOT))/MathLog(10)));
   SummAllLots(Symbol(), Magic, SumLotsB, SumLotsS);
   Alert("Сумма лотов Buy = "+DoubleToStr(SumLotsB,dgl)+
         ", Сумма лотов Sell = "+DoubleToStr(SumLotsS,dgl));
   return(0);
}
//+------------------------------------------------------------------+
void SummAllLots(string sy, int mn, double &lb, double &ls) {
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(OrderMagicNumber()!=mn) continue;
      if(OrderSymbol()!=sy)      continue;
      if(OrderType()==0) lb+=OrderLots();
      if(OrderType()==1) ls+=OrderLots();
      }
}
//+------------------------------------------------------------------+
Sergey Dzyublik
4788
Sergey Dzyublik 2013.12.10 23:36  
evillive:
Как лоты могут быть отрицательными?

А так-то, можно без continue:


Очень просто могут быть отрицательны - когда голова думает одно, а руки - иное.

Зачем без continue ??

Так быстрее с continue, в 509 билде, чем ваш вариант без continue (50 ордеров на других парах, 50 на искомой, 100000 итераций)

В 556 билде в 4 раза дольше считает любой варианта, а также результат зависит от порядка применения функции (какая-то иная стадия расчета является лимитирующей)

int start(){
   int ii;   int startt,stopp;    double rezal=0;
   
   for(ii=0;ii<100000;ii++)                  // прогонка для забития памяти (влияет в 556 билде на результат первого расчета)                 
      rezal=TotalPositionT1(0);              
      
   startt=GetTickCount();
   for( ii=0;ii<100000;ii++)
      rezal= TotalPositionT2 (0);
   stopp=GetTickCount();
   Alert("TotalPositionT2=",stopp-startt,"  iteration=",ii,"  pos=",rezal);

   startt=GetTickCount();
   for( ii=0;ii<100000;ii++)
      rezal=  TotalPositionT1 (0);
   stopp=GetTickCount();
   Alert("TotalPositionT1=",stopp-startt,"  iteration=",ii,"  pos=",rezal);

   return(0);
}
//+------------------------------------------------------------------+
double TotalPositionT1(int magic,string symbol=""){
   double total_possition=0;
   if((symbol=="") || (symbol=="0")) symbol=Symbol();
   for(int i=OrdersTotal()-1;i>=0;i--){
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderMagicNumber()==magic && OrderSymbol()==symbol){
         if(OrderType()==0)total_possition+=OrderLots();
         if(OrderType()==1)total_possition-=OrderLots();
      }
   }
   return(total_possition);
}
//+------------------------------------------------------------------+
double TotalPositionT2(int magic,string symbol=""){
   double total_possition=0;
   if((symbol=="") || (symbol=="0")) symbol=Symbol();
   for(int i=OrdersTotal()-1;i>=0;i--){
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;
      if(OrderMagicNumber()!=magic)continue;
      if(OrderSymbol()!=symbol)continue;
      if(OrderType()==0)total_possition+=OrderLots();
      if(OrderType()==1)total_possition-=OrderLots();
   }
   return(total_possition);
}

2013.12.11 01:30:25 oop USDJPY,H1: Alert: TotalPositionT1=3760 iteration=100000 pos=1.2

2013.12.11 01:30:21 oop USDJPY,H1: Alert: TotalPositionT2=3666 iteration=100000 pos=1.2


2013.12.11 01:30:02 oop USDJPY,H1: Alert: TotalPositionT1=3697 iteration=100000 pos=1.2

2013.12.11 01:29:58 oop USDJPY,H1: Alert: TotalPositionT2=3572 iteration=100000 pos=1.2


2013.12.11 01:29:45 oop USDJPY,H1: Alert: TotalPositionT1=3776 iteration=100000 pos=1.2

2013.12.11 01:29:42 oop USDJPY,H1: Alert: TotalPositionT2=3634 iteration=100000 pos=1.2


2013.12.11 01:29:05 oop USDJPY,H1: Alert: TotalPositionT1=3728 iteration=100000 pos=1.2

2013.12.11 01:29:01 oop USDJPY,H1: Alert: TotalPositionT2=3682 iteration=100000 pos=1.2


2013.12.11 01:28:53 oop USDJPY,H1: Alert: TotalPositionT1=3635 iteration=100000 pos=1.2

2013.12.11 01:28:50 oop USDJPY,H1: Alert: TotalPositionT2=3557 iteration=100000 pos=1.2


2013.12.11 01:28:41 oop USDJPY,H1: Alert: TotalPositionT1=3760 iteration=100000 pos=1.2

2013.12.11 01:28:38 oop USDJPY,H1: Alert: TotalPositionT2=3650 iteration=100000 pos=1.2

Yuriy Zaytsev
13034
Yuriy Zaytsev 2013.12.11 07:43  

+ тоже стараюсь писать коды которые работают быстро

Vitalie Postolache
11960
Vitalie Postolache 2013.12.11 10:49  

То есть выигрыш не более 150 мс на 100000 итераций, это не более 1,5 мкс на 1 итерацию, да это просто агромадный выигрыш по времени )))

Учитывая что больше 200 рыночных позиций редко кто видел на одном счету...

Но у каждого свои методы, конечно...

Yuriy Zaytsev
13034
Yuriy Zaytsev 2013.12.11 12:27  

так думает большинство и потому программы работают дико медлено - потому что в индустрию пришло много пофигистов, это шаблон ... мышления! большинста -

выходит новое железо в 5 10 100 10000000 раз быстрее предыдущего а софт работает все медленней и медленней

в одном месте тормозит на 1.5мк а кое где минут по 15 вместо 10 секунд, постоянно борюсь с придурочными SQL кодами дебилов, которым доверили писать коды.

При этом времени на код который будет работать быстрее уйдет не намного больше, конечно если мозг заточен удачно.

---

Момнится Стив Джоб дрючил своих программистов требуя ускорить работу загрузчика и кстати добился своего!

Он очень образно приводил пример почему нужно ускорить !

Говорил : Просто представь миллионы компьютеров которые загружаются на 5 секунд медленней - если все сложить получится человечкская жизнь а это не так мало.

---

Тех кто считает - да лишь бы работало, Стив и увольнял из компании Apple. и судя по результатам работы Apple он был прав.

Перфоционизм в его варианте - хорошая и полезная субстанция.

--

Не Надо быть обыденной серостью

/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий