externdouble Lots=0.03;// Жестко заданное колич. лотов.................................// Учёт количества имеющихся ордеров
Symb=Symbol();// Название фин.инстр.
BuyTotalOp=0;// Количество Buy ордеров
SellTotalOp=0;// Количество Sell ордеровfor(int i=1; i<=OrdersTotal(); i++)// Цикл перебора ордер{if(OrderSelect( i-1, SELECT_BY_POS)==true)// Если есть следующий{// Анализ ордеров:if(OrderSymbol()!= Symb)continue;// Не наш фин. инструмif(OrderType()>1)// Попался отложенный{Alert("Обнаружен отложенный ордер. Эксперт не работает.");return;// Выход из start()}if(OrderType()==OP_BUY){
BuyTotalOp++;// Счётчик ордеров Buy......................................//Проверка если открыто несколько БАЙ-позицийif(OrderType()==OP_BUY&& BuyTotalOp>1)// Тип ордера бай и ордеров по циклу "с начала" = 1{//.................................... //---- если условия закрытия нескольких лотов БАЙif( BuyOrdProf>0){//---- закрываем 1-ю часть позицииAlert("Попытка закрыть Buy ", TicketCl,". Ожидание ответа..");RefreshRates();// Обновление данных
Ans=OrderClose( CloseTicketCl, Lots,Bid,0,Red);// Закрытие Buyif( Ans==true)// Получилось :){Alert("Закрыт ордер Buy ", TicketCl);break;// Выход из цикла закр}if( Fun_Error(GetLastError())==1)// Обработка ошибокcontinue;// Повторная попыткаreturn;// Выход из start()}}//.........................................//Проверка если открыта одна БАЙ-позицияif(OrderType()==OP_BUY&& BuyTotalOp==1)// Тип ордера бай и ордеров по циклу "с начала" = 1{//.................................... //---- если условия закрытия одного лота БАЙif( BUYCLOSE_1PART && BuyClLot== Lots){//---- закрываем 1-ю часть позицииAlert("Попытка закрыть Buy ", TicketCl,". Ожидание ответа..");RefreshRates();// Обновление данных
Ans=OrderClose( CloseTicketCl, LotCloseBuy/3,Bid,0,Red);// Закрытие Buyif( Ans==true)// Получилось :){Alert("Закрыт ордер Buy ", TicketCl);break;// Выход из цикла закр}if( Fun_Error(GetLastError())==1)// Обработка ошибокcontinue;// Повторная попыткаreturn;// Выход из start()}
// Учёт количества имеющихся ордеров от начала к концу
Symb=Symbol();// Название фин.инстр.
BuyTotalOp=0;// Количество Buy ордеров
SellTotalOp=0;// Количество Sell ордеровfor(int i=1; i<=OrdersTotal(); i++)// Цикл перебора ордер{if(OrderSelect( i-1, SELECT_BY_POS)==true)// Если есть следующий{// Анализ ордеров:if(OrderSymbol()!= Symb)continue;// Не наш фин. инструмif(OrderType()>1)// Попался отложенный{Alert("Обнаружен отложенный ордер. Эксперт не работает.");return;// Выход из start()}if(OrderType()==OP_BUY){
BuyTotalOp++;// Счётчик ордеров Buy....................................
//Проверка если открыто несколько БАЙ-позицийif(OrderType()==OP_BUY&& BuyTotalOp>1)// Тип ордера бай и ордеров по циклу "с начала" = 1{//.................................... //---- если условия закрытия нескольких лотов БАЙif( BuyOrdProf>0){//---- закрываем 1-ю часть позицииAlert("Попытка закрыть Buy ", TicketCl,". Ожидание ответа..");RefreshRates();// Обновление данных
Ans=OrderClose( CloseTicketCl, BuyTotalOp,Bid,0,Red);// Закрытие Buy...................................................................
伊戈尔,你能给我一个提示吗?EA中的指标(iMA)的数值有4个小数点,而我需要5个小数点来进行工作!为什么?我试过NormalizeDouble(iMA,Digits)--仍然是4位小数。是否有必要将整个指标改写成专家顾问的子程序-功能来获得5位数?
帮助:Alert(), Comment(), Print()
双重类型的数据在输出时,点后有4位小数。
使用DoubleToStr() 可以更准确地输出数字。
晚上好。
我无法应付正确的平仓。平仓有两个条件:1.如果有一个仓位未平;2.如果有两个(或多个)仓位未平。在这两种情况下,手数=0.03。在第一种情况下,手数被单独关闭了0.01(在上面的帖子中计算过)。在第二种情况下,两只手都应该以0.03的价格平仓。相应地,如果。
则是关闭的第一个变体,如果。
然后是另一个(在我的变体(初步)中,如果两个头寸的利润之和>0,那么两个头寸都应该被关闭)。它看起来像这样。
事实上,事实证明,当两个手的关闭条件出现时,第一个手完全关闭,而第二个手 "接管 "关闭条件BuyTotalOp==1,并根据自己的条件关闭。
请告知关闭条件有什么问题,如何使两个地段同时关闭?提前感谢。
把苍蝇从肉片中分离出来......写一些有用的函数......
例如,按订单类型计算未结订单的数量,按订单类型计算平仓订单,等等。
那么一切都会变得更容易...
......因为你有一个缺失的}的地方,而且变得不清楚到底在做什么......可能是你试图暂时计算订单的数量 并立即删除它们,或者是什么? 挂起的订单可能更好地跳过,当它们存在时不要中断?
一个好的选择是一个函数,根据给定的条件,将形成一个带有参数的未平仓订单的数组,你可以运行并关闭它们......一般来说,在结构上下功夫......
谢谢keekkenen,我最近才想到要创建一个阵列。只是我从来没有用它工作过,希望有一个更简单的解决方案,我已经有了一个 "封闭 "的眼睛,一个有新鲜感的人看了之后会说:"哎呀,你算的某某某呢......"。好了,循环中的所有买单都已经计算出来了。
和OrderClose 不计算它们...
嗯,是的,这显然是 "过犹不及".......。坦率地说,我不明白这一点。
和这个,特别是手数除以3的情况?
为什么不在这两种情况下?
为什么不在这两种情况下?
CloseTicketCl =OrderTicket () 一般来说,你可以这样做。
而这一点,特别是将手数除以3??订单关闭时的手数与开仓时相同......
不相同
。三分之一的手被关闭(根据其中一个条件--比方说价格已经达到+150点)。第二个三分之一将关闭,例如,当从开盘+300点,等等。
坦率地说,我不明白这个
,这里的Lots和OrderLots()是的,是同一件事。一个订单--一个手数,如果你开了一个有3个手数的订单,你不能以任何方式分割手数--先是1,然后是1,然后是1--订单关闭整个手数,也就是说,订单关闭时的手数与开仓时相同,你不能分批关闭订单...