KimIVの便利な機能 - ページ 86

 

イゴール、ヒントをくれないか?EAのインジケータ(iMA)の値が小数点以下4桁なのですが、仕事上5桁が必要なのです。NormalizeDouble(iMA,Digits) を試してみましたが、やはり小数点以下が4桁になってしまいます。5桁にするためには、Expert Advisorのサブプログラム関数にインジケータ全体を書き換える必要があるのでしょうか?

 

ヘルプ: Alert()、Comment()、Print()

double 型のデータは、小数点以下4桁で出力されます。

DoubleToStr() を使って、より精度の高い数値を出力することができます。

 

こんばんは。

ポジションを 正しく閉じることができないので、対応できない。1.1つのポジションが開いている場合、2.2つ(またはそれ以上)のポジションが開いている場合、の2つの条件で決済されます。どちらの場合も、ロットボリューム=0.03です。最初のケースでは、0.01(上の書き込みで計算)だけ別にロットを閉じます。2番目のケースでは、2つのロットは0.03で両方閉じる必要があります。

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

であれば、最初のバリアントであるclosingとif。

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()
        }
 

実際、両方のロットを閉じる条件が現れたとき、1番目のロットは完全に閉じ、2番目のロットは閉じる条件BuyTotalOp==1を「引き継ぎ」、自分の条件に従って閉じることが判明しました。

クロージング条件のどこが悪いのか、どうすれば2区画とも一度にクロージングできるのか、アドバイスをお願いします。ありがとうございました。

 
OrderTicket()とLots countingとplusingの両方を注文ループの中で試しましたが、効果はありませんでした。たぶん、いつものように「真実はどこか近くにある」のだろうが、それが伝わらない...。
 

フライとカツを切り分ける...便利な機能を書く...。

例えば、注文の種類ごとに未決済注文の数を数える、注文の種類ごとに決済注文を数える、などなど...。

そうすれば、すべてが簡単になる......。

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

同じではない

ロットの3分の1がクローズされます(条件の1つにより、価格が+150pipsに達したとします)。2番目の3分の1は、例えば、オープニングから+300pipsの時にクローズする、など。

と率直に言って、私はこの

Ans=OrderClose( CloseTicketCl, Lots,Bid,0,Red);          // Закрытие Buy
ここ Lots と OrderLots() そう、同じものなのだ、ということが理解できない。
 
hope >> 同じではない。ロットの3分の1がクローズされます(条件の1つにより、価格が+150ポイントに達したと仮定します)。2番目の3分の1は、例えば、オープニングから+300pipsのときに閉じます、など。

1つの注文 - 1つのロット、3つのロットで注文を開いた場合、どのような方法でもロットを分割することはできません - 最初に1、次に1、次に1 - 注文はロット全体を閉じます、すなわち、注文はそれが開かれたのと同じロットで閉じます、あなたは部分的に注文を閉じることはできません...。