KimIV的有用功能 - 页 86

 

伊戈尔,你能给我一个提示吗?EA中的指标(iMA)的数值有4个小数点,而我需要5个小数点来进行工作!为什么?我试过NormalizeDouble(iMA,Digits)--仍然是4位小数。是否有必要将整个指标改写成专家顾问的子程序-功能来获得5位数?

 

帮助:Alert(), Comment(), Print()

双重类型的数据在输出时,点后有4位小数。

使用DoubleToStr() 可以更准确地输出数字。

 

晚上好。

我无法应付正确的平仓。平仓有两个条件:1.如果有一个仓位未平;2.如果有两个(或多个)仓位未平。在这两种情况下,手数=0.03。在第一种情况下,手数被单独关闭了0.01(在上面的帖子中计算过)。在第二种情况下,两只手都应该以0.03的价格平仓。相应地,如果。

if (OrderType()==OP_BUY && BuyTotalOp==1)

则是关闭的第一个变体,如果。

if (OrderType()==OP_BUY && BuyTotalOp>1)

然后是另一个(在我的变体(初步)中,如果两个头寸的利润之和>0,那么两个头寸都应该被关闭)。它看起来像这样。

   extern double 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);          // Закрытие Buy
         if ( 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);          // Закрытие Buy
         if ( Ans==true)                             // Получилось :)
           { 
            Alert ("Закрыт ордер Buy ", TicketCl);
            break;                                  // Выход из цикла закр
           }
         if ( Fun_Error(GetLastError())==1)          // Обработка ошибок
            continue;                               // Повторная попытка
         return;                                    // Выход из start()
        }
 

事实上,事实证明,当两个手的关闭条件出现时,第一个手完全关闭,而第二个手 "接管 "关闭条件BuyTotalOp==1,并根据自己的条件关闭。

请告知关闭条件有什么问题,如何使两个地段同时关闭?提前感谢。

 
我尝试了OrderTicket()和Lots counting以及在订单循环中进行加法运算--但都没有成功。也许,像往常一样,"真相就在附近",但它并没有抓住......
 

把苍蝇从肉片中分离出来......写一些有用的函数......

例如,按订单类型计算未结订单的数量,按订单类型计算平仓订单,等等。

那么一切都会变得更容易...

if ( ordersTotal( SYMBOL,OP_BUY)==1) closeAllOrders( SLIPPAGE, TRY, TRADESLEEP, SHOWERRORS, SYMBOL,OP_BUY);
if ( ordersTotal( SYMBOL,OP_BUY) > 1) closeAllOrders( SLIPPAGE, TRY, TRADESLEEP, SHOWERRORS, SYMBOL,OP_BUY);

......因为你有一个缺失的}的地方,而且变得不清楚到底在做什么......可能是你试图暂时计算订单的数量 并立即删除它们,或者是什么? 挂起的订单可能更好地跳过,当它们存在时不要中断?

一个好的选择是一个函数,根据给定的条件,将形成一个带有参数的未平仓订单的数组,你可以运行并关闭它们......一般来说,在结构上下功夫......

 

谢谢keekkenen,我最近才想到要创建一个阵列。只是我从来没有用它工作过,希望有一个更简单的解决方案,我已经有了一个 "封闭 "的眼睛,一个有新鲜感的人看了之后会说:"哎呀,你算的某某某呢......"。好了,循环中的所有买单都已经计算出来了。

   // Учёт количества имеющихся ордеров от начала к концу
   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
....................................

OrderClose 不计算它们...

   //Проверка если открыто несколько БАЙ-позиций
   if (OrderType()==OP_BUY && BuyTotalOp>1)        // Тип ордера бай и ордеров по циклу "с начала" = 1
     {
//....................................     
      //---- если условия закрытия нескольких лотов БАЙ
      if ( BuyOrdProf>0)
        {
         //---- закрываем 1-ю часть позиции
         Alert("Попытка закрыть Buy ", TicketCl,". Ожидание ответа..");
         RefreshRates();                            // Обновление данных
         Ans=OrderClose( CloseTicketCl, BuyTotalOp,Bid,0,Red);          // Закрытие Buy
...................................................................
嗯,是的,这显然是 "过犹不及".......。
 

坦率地说,我不明白这一点。

Ans=OrderClose( CloseTicketCl, Lots,Bid,0,Red);          // Закрытие Buy

和这个,特别是手数除以3的情况?

Ans=OrderClose( CloseTicketCl, LotCloseBuy/3,Bid,0,Red);          // Закрытие Buy

为什么不在这两种情况下?

Ans=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Red);          // Закрытие Buy
 

为什么不在这两种情况下?

Ans=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Red);          // Закрытие Buy

CloseTicketCl =OrderTicket () 一般来说,你可以这样做。

而这一点,特别是将手数除以3??订单关闭时的手数与开仓时相同......

Ans=OrderClose( CloseTicketCl, LotCloseBuy/3,Bid,0,Red);          // Закрытие Buy

不相同

三分之一的手被关闭(根据其中一个条件--比方说价格已经达到+150点)。第二个三分之一将关闭,例如,当从开盘+300点,等等。

坦率地说,我不明白这个

Ans=OrderClose( CloseTicketCl, Lots,Bid,0,Red);          // Закрытие Buy
,这里的Lots和OrderLots()是的,是同一件事。
 
hope >> 不一样的。三分之一的手将被关闭(根据其中一个条件 - 让我们假设价格已经达到+150点)。第二个三分之一将关闭,比如说,当从开盘起+300点,等等。

一个订单--一个手数,如果你开了一个有3个手数的订单,你不能以任何方式分割手数--先是1,然后是1,然后是1--订单关闭整个手数,也就是说,订单关闭时的手数与开仓时相同,你不能分批关闭订单...