[ARCHIVE!] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 4. - 페이지 112

 

겁먹을 필요가 없습니다.

나는 "이 고문이 주문을 일괄적으로 마감하지 않도록 하는 방법"에 대한 귀하의 질문에 대한 답변을 썼습니다. -

- 어드바이저가 주문을 일괄 마감하는 것을 방지하기 위해서는 1차 마감 후 주문 마감 주기에서 반품을 해야 합니다.

맞다?

 
Solree :
이에 대해 조금 더 자세히 말씀해 주시겠습니까? 어렵지 않다면 이것으로 코드 조각 :)

다음은 표시기 하위 창의 수직 크기 조정을 설정하기 위한 코드 조각입니다.

   // Для буфера развёртки по вертикали.
   SetIndexBuffer ( 0 , gl_adBufIndicator1);               // Индикаторный буфер для стабилизации и размера изображения графика в дополнительном подокне.
   SetIndexEmptyValue ( 0 , EMPTY_VALUE );                 // Устанавливаем значение пустой величины для линии индикатора.
   SetIndexLabel ( 0 , "VERTICAL SWEEP" );                   // Установка имени линии индикатора для отображения информации в окне DataWindow и всплывающей подсказке.
   SetIndexStyle ( 0 , DRAW_NONE , EMPTY, EMPTY, CLR_NONE ); // Линию не показываем. 
   //==== Устанавливаем развёртку.
   if (st_nWBeginChart <= 0 ) st_nWBeginChart = 0 ;
   for (i = st_nWFirstVisiblBar; i >= st_nWBeginChart; i--)
   { // Очищаем буфер от лишних значков для вызова окна свойств индикатора.
     if (i > 0 ) gl_adBufIndicator2[i] = EMPTY_VALUE ;
     // Закрепление вертикальной развёртки графика с помощью индикаторного буфера.
     if (i % 2 == 0 ) gl_adBufIndicator1[i] = gl_dMaxPositionMark; // Для фиксации верхней координаты дополнительного окна.
     else gl_adBufIndicator1[i] = gl_dMinPositionMark;             // Для фиксации нижней координаты дополнительного окна.
   }
   //==== Расчёт и создание горизонтальных линий разметки.
   if ((gl_dMaxPositionMark - gl_dMinPositionMark) != tmp_dDifferPosMark) // Создаём один раз и отслеживаем через заданный уровень при увеличениях максимальных уровней.
   { // Расчёт и создание горизонтальных линий разметки.
    MakingHorizontalSectoring(AutoStep, Color_LNH, Color_LN0, gl_dMaxPositionMark, gl_dMinPositionMark, Step_LNH, 15 , Style_LNH, Width_LNH, st_nWindow, gl_sFullNameObject);
   }

수평선 을 설정하는 기능입니다. 이 기능은 표시기 코드에서만 작동합니다. 라이브러리에서 작동하지 않습니다.

 // 2. Функция расчёта и создания горизонтальных линий разметки.
void MakingHorizontalSectoring( bool    bAutoStep, // Переключатель true/fals = автоматическое/ручное распределение уровней.
                               color   clLine,     // Цвет уровней.
                               color   clLine0,   // Цвет нулевого уровня.
                               double dScaleMAX, // Максимальное значение шкалы.
                               double dScaleMIN, // Минимальное значение шкалы.
                               double dStepH,     // При AutoStp = true/false - количество линий/растояние между линиями.
                               int     nLimiter,   // Ограничение десятичных разрядов в вычислениях порядка амплитуды.
                               int     nStyle,     // Стиль уровней.
                               int     nWidth,     // Толщина уровней.
                               int     nWindow,   // Номер подокна для создания нулевой линий.
                               string sName)     // Имя для индивидуального имени нулевой горизонтальной линии.
 {
   double dStepLN = 0 ;
   int     nExponent = 0 ;
   int     i = 0 , j = 0 , n = 0 ;
   int     nLowLevel = 0 ;
   int     nStep = 0 ;
   int     nUpLevel = 0 ;
   //----
   if ( 1000000 * dStepH != 0 )
   {
     if (bAutoStep == true) // Автоматическая установка горизонтальных линий по заданному количеству линий по вертикали.
     {
      dStepLN = (dScaleMAX - dScaleMIN) / dStepH; // Считаем шаг в виде числа двойной точности.
       // Вычисление порядка исходного десятичного числа.
       if (dStepLN * MathPow ( 10 , nLimiter) != 0 )   // Если число меньше единицы. Проверяем на равенство первому разряду.
       {
         if (dStepLN < 1 )
         {
           for (nExponent = 0 ; nExponent <= nLimiter; nExponent++)
           {
            i = dStepLN * MathPow ( 10 , nExponent);
             if (i >= 1 ) break ;
           }
         }
         if ( 1 <= dStepLN && dStepLN < 10 ) nExponent = 0 ; // Если число между единицей и десятью. Возвращаем нулевой порядок.
         if (dStepLN >= 10 )                               // Если число больше или равно единицы. Проверяем на равенство первому разряду.
         {
           for (nExponent = 0 ; nExponent >= -nLimiter; nExponent--)
           {
            i = dStepLN * MathPow ( 10 , nExponent);
             if (i <= 9 ) break ;
           }
         }
       }
       else nExponent = 0 ;                                   // Если число с заданной точностью равно нулю.
      nStep = MathRound (dStepLN * MathPow ( 10 , nExponent)); // Преобразум шаг в целое число и окруляем его.
       switch (nStep)                                       // Приводим к стандартному шагу.
       {
         case 1 :  nStep =   2 ; break ;
         case 2 :  nStep =   2 ; break ;
         case 3 :  nStep =   2 ; break ;
         case 4 :  nStep =   5 ; break ;
         case 5 :  nStep =   5 ; break ;
         case 6 :  nStep =   5 ; break ;
         default : nStep = 10 ;
       }
      dStepLN = nStep * MathPow ( 10 , -nExponent);
      nUpLevel  = (dScaleMAX - MathMod (dScaleMAX, dStepLN)) / dStepLN + 1 ; // Верхняя граница шкалы для отсчёта шага.
      nLowLevel = (dScaleMIN - MathMod (dScaleMIN, dStepLN)) / dStepLN - 1 ; // Нижняя граница шкалы для отсчёта шага.
       for (j = nUpLevel; j >= nLowLevel && 1000000 * dStepLN > 0 ; j--, i++) if (j != 0 ) SetLevelValue (i, j * dStepLN);
      i++;
       for (n = i; n <= 31 ; n++) SetLevelValue (n, (j + 1 ) * dStepLN); // Собираем оставшиеся уровни на последней координате, чтобы не мешались.
     }
     else // Ручная установка горизонтальных линий по заданному шагу по вертикали.
     {
      nUpLevel  = (dScaleMAX - MathMod (dScaleMAX, dStepH)) / dStepH + 1 ; // Верхняя граница шкалы для отсчёта шага.
      nLowLevel = (dScaleMIN - MathMod (dScaleMIN, dStepH)) / dStepH - 1 ; // Нижняя граница шкалы для отсчёта шага.
       for (j = nUpLevel; j >= nLowLevel && 1000000 * dStepH > 0 ; j--, i++) if (j != 0 ) SetLevelValue (i, j * dStepH);
      i++;
       for (n = i; n <= 31 ; n++) SetLevelValue (n, (j + 1 ) * dStepLN); // Собираем оставшиеся уровни на последней коордиеате, чтобы не мешались.
     }
   }
   SetLevelStyle (nStyle, nWidth, clLine);
   // Удаляем горизонтальную нулевую линию.
   ObjectDelete (sName + " HLINE 0" );
   // Создаём объект "HLINE 0". Этот объект создаётся всегда.
   ObjectCreate (sName + " HLINE 0" , OBJ_HLINE , nWindow, 0 , 0 );
   ObjectSet    (sName + " HLINE 0" , OBJPROP_COLOR , clLine0);
   ObjectSet    (sName + " HLINE 0" , OBJPROP_STYLE , nStyle);
   ObjectSet    (sName + " HLINE 0" , OBJPROP_WIDTH , nWidth);
 }

그래픽 개체로 그리기를 직접 이해합니다. 모든 것이 개별적입니다.

 
sergeev :

겁먹을 필요가 없습니다.

나는 "이 고문이 주문을 일괄적으로 마감하지 않도록 하는 방법"에 대한 귀하의 질문에 대한 답변을 썼습니다. -

- 어드바이저가 주문을 일괄 마감하는 것을 방지하기 위해서는 1차 마감 후 주문 마감 주기에서 반품을 해야 합니다.

맞다?

반품이 이미 주문 마감 주기에 있는 것을 볼 수 있습니다. 첫 주문 마감은 어디에서 확인하나요?

 int CloseOrder( int ticket, double lots)
              {
               int err,i1;
               double price;
               OrderSelect (ticket,SELECT_BY_TICKET,MODE_TRADES);
               if (lots< MarketInfo ( Symbol (),MODE_MINLOT))lots= MarketInfo ( Symbol (),MODE_MINLOT);
               while (i1< 10 )
                   {
                     RefreshRates ();
                     if ( OrderType ()== 0 )price=Bid;
                     if ( OrderType ()== 1 )price=Ask;
                     if ( OrderType ()> 1 ){ OrderDelete (ticket); return ( 0 );}
                     OrderClose (ticket,lots, NormalizeDouble (price, Digits ),Slippage, Goldenrod );
                    err = GetLastError ();
                     if (err == 0 ) break ;
                     Print ( WindowExpertName (), Symbol (),Error(err), "  при закрытии ордера" );
                     Sleep ( 100 );
                    i1++;
                   }
               return ( 0 );
              }
 
alex12 :

보시다시피 반품은 이미 주문 마감 주기에 있습니다. 첫 주문 마감은 어디에서 확인하나요?


주문 주기가 아닙니다.

이것은 하나의 주문에 대한 시도의 완고한 검색입니다.

더 멀리 봐

 
sergeev :

주문 주기가 아닙니다.

이것은 하나의 주문에 대한 시도의 완고한 검색입니다.

더 멀리 봐

여기에 return을 삽입했습니다. 맞아요?

 /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /
int CloseMarket()
   {
     for ( int j= 0 ; j<OrdersTotal(); j++)
      {
       OrderSelect(j,SELECT_BY_POS,MODE_TRADES);
       if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()< 2 )
         {
          CloseOrder(OrderTicket(),OrderLots());
          j--;
           return ( 0 );
         }
      }
   }
/// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// //
 
alex12 :

여기에 return을 삽입했습니다. 맞아요?


글쎄, 어떻게 생각해?

코드 베이스에 출판물이 있는 사람을 이 스레드에서 보는 것이 전혀 이상합니다.

 

여러분, 손익분기점으로 주문을 수정하는 코드를 작성하는 방법.

스톱이 1pp만큼 플러스로 드래그되고 더 이상 만지지 않도록 만들어야합니다.

내 버전에서

               switch (Tip)
                  {
                   case 0 :
                     if (Ask>op+ts* Point )sl=op+d* Point ;
                     break ;
                   case 1 :
                     if (Bid<op-ts* Point )sl=op-d* Point ;
                  }

               OrderModify (Ticket,op,sl,takeprofit, 0 );

조건이 참일 때마다 순서를 수정해야 합니다. 어떻게 쓰는지 알려주세요.

추신.

            ts= 300 ,     //-- ts - трейлинг
            d= 10 ;       //-- d - на 'd' пп передвинуть в безубыток     
 
sergeev :

글쎄, 어떻게 생각해?

코드 베이스에 출판물이 있는 사람을 이 스레드에서 보는 것이 전혀 이상합니다.

나는 또한 결과를 테스트했습니다 - 나는 2 개의 주문을 열었고 이익으로 닫지 않았고 하나 더 열지 않았습니다.

따라서 이 옵션은 적합하지 않습니다.

나는 내 아이디어를 코드 베이스에 게시했고 경험 많은 프로그래머가 조언자를 주문하기 위해 저에게 편지를 썼습니다.

나는 모든 것을 포기합니다. 반환을 어디에 넣어야 할지 모르겠고 모든 곳에 삽입하려고 했습니다.

 
Zhunko :

다음은 표시기 하위 창의 수직 크기 조정을 설정하기 위한 코드 조각입니다.

수평선을 설정하는 기능입니다. 이 기능은 표시기 코드에서만 작동합니다. 라이브러리에서 작동하지 않습니다.

그래픽 개체로 그리기를 직접 이해합니다. 모든 것이 개별적입니다.

고마워, 나는 그것을 알아 내려고 노력할 것이다 :)
 
alex12 :

나는 또한 결과를 테스트했습니다 - 나는 2 개의 주문을 열었고 이익으로 닫지 않았고 하나 더 열지 않았습니다.

따라서 이 옵션은 적합하지 않습니다.

그래서 우리는 첫 번째 게시물로 돌아갑니다. "... 불완전한 TK"