Скачать MetaTrader 5

Функция подсчета общего лота на бай и селл ордерах.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Evgeniy Zhdan
7281
Evgeniy Zhdan  
Здравствуйте! Подскажите пожалуйста как написать функцию, которая бы подсчитывала общее количество лотов (один общий размер лота) из открытых советником ордеров. Надо чтобы магик и символ учитывались. Сам не могу додуматься...
Sergey Dzyublik
5194
Sergey Dzyublik  
   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
12441
Vitalie Postolache  
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  
Функция ALXIMIKSa подсчитает абсолютное число лотов, всех, и buy и sell. То есть если у вас 3 buy и 2 sell то функция выдаст 5. Положительных, отрицательных не будет. Если же вам нужна нет позиция (для хеджирования например) то нужно подсчитать отдельно buy и отдельно sell и найти разницу. А там уже разница будет либо положительная либо отрицательная, по знаку и будете знать каких лотов больше buy или sell, (это уже зависит от того что от чего отнимать). Код у вас почти готов, только дописать надо.
Алексей Тарабанов
7330
Алексей Тарабанов  
Нет, работать не будет, если не поменять местами symbol и magic.
Vitalie Postolache
12441
Vitalie Postolache  
tara:
Нет, работать не будет, если не поменять местами symbol и magic.

Доказательства будут?
Artyom Trishkin
Модератор
87650
Artyom Trishkin  
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
5194
Sergey Dzyublik  
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
16516
Yuriy Zaytsev  

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

Vitalie Postolache
12441
Vitalie Postolache  

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

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

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

Yuriy Zaytsev
16516
Yuriy Zaytsev  

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

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

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

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

---

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

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

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

---

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

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

--

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

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