- Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
- [АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5.
- Как посчитать общее кол-во лотов на открытых ордерах
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); }
больше нуля - лоты бай, меньше нуля - лоты селл.
Не проверял - так написал, кажись должно работать.
больше нуля - лоты бай, меньше нуля - лоты селл.
Не проверял - так написал, кажись должно работать.
А так-то, можно без 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); }
Нет, работать не будет, если не поменять местами symbol и magic.
Доказательства будут?
Здравствуйте! Подскажите пожалуйста как написать функцию, которая бы подсчитывала общее количество лотов (один общий размер лота) из открытых советником ордеров. Надо чтобы магик и символ учитывались. Сам не могу додуматься...
//+------------------------------------------------------------------+ //| Сумма всех лотов.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(); } } //+------------------------------------------------------------------+
Как лоты могут быть отрицательными?
А так-то, можно без 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
+ тоже стараюсь писать коды которые работают быстро
То есть выигрыш не более 150 мс на 100000 итераций, это не более 1,5 мкс на 1 итерацию, да это просто агромадный выигрыш по времени )))
Учитывая что больше 200 рыночных позиций редко кто видел на одном счету...
Но у каждого свои методы, конечно...
так думает большинство и потому программы работают дико медлено - потому что в индустрию пришло много пофигистов, это шаблон ... мышления! большинста -
выходит новое железо в 5 10 100 10000000 раз быстрее предыдущего а софт работает все медленней и медленней
в одном месте тормозит на 1.5мк а кое где минут по 15 вместо 10 секунд, постоянно борюсь с придурочными SQL кодами дебилов, которым доверили писать коды.
При этом времени на код который будет работать быстрее уйдет не намного больше, конечно если мозг заточен удачно.
---
Момнится Стив Джоб дрючил своих программистов требуя ускорить работу загрузчика и кстати добился своего!
Он очень образно приводил пример почему нужно ускорить !
Говорил : Просто представь миллионы компьютеров которые загружаются на 5 секунд медленней - если все сложить получится человечкская жизнь а это не так мало.
---
Тех кто считает - да лишь бы работало, Стив и увольнял из компании Apple. и судя по результатам работы Apple он был прав.
Перфоционизм в его варианте - хорошая и полезная субстанция.
--
Не Надо быть обыденной серостью
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования