[ARŞİV!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde - 4. - sayfa 112

 

korkmana gerek yok.

"Bu danışmanın siparişleri toplu halde kapatmamasını nasıl sağlarım" sorusuna birebir cevap yazdım. -

- Danışmanın siparişleri toplu olarak kapatmasını önlemek için ilk kapanıştan sonra sipariş kapanış döngüsünden iade yapmanız gerekir.

uyuyor mu?

 
Solree :
Bu konuda biraz daha detay verebilir misiniz? Bununla ilgili bir kod parçası, zor değilse :)

Bunlar, gösterge alt penceresinin dikey görüntüsünü ayarlamak için kodun parçalarıdır.

   // Для буфера развёртки по вертикали.
   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);
   }

Bu, yatay çizgileri ayarlamak için bir işlevdir. İşlev yalnızca gösterge kodundan çalışır. Kütüphaneden çalışmıyor.

 // 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);
 }

Grafik nesnelerle çizimi kendiniz anlayın. Her şey bireyseldir.

 
sergeev :

korkmana gerek yok.

"Bu danışmanın siparişleri toplu halde kapatmamasını nasıl sağlarım" sorusuna birebir cevap yazdım. -

- Danışmanın siparişleri toplu olarak kapatmasını önlemek için ilk kapanıştan sonra sipariş kapanış döngüsünden iade yapmanız gerekir.

uyuyor mu?

İadenin zaten sipariş kapanış döngüsünde olduğunu görüyorsunuz. Siparişlerin ilk kapanışı için nereye bakmalı?

 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 :

İadenin zaten sipariş kapanış döngüsünde olduğunu görüyorsunuz. Siparişlerin ilk kapanışı için nereye bakmalı?


bu bir sipariş döngüsü değildir.

bu, tek bir sipariş için inatçı bir girişim arayışıdır.

ileriye bak

 
sergeev :

bu bir sipariş döngüsü değildir.

bu, tek bir sipariş için inatçı bir girişim arayışıdır.

ileriye bak

buraya iade ekledim. Doğru şekilde ?

 /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /
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 :

buraya iade ekledim. Doğru şekilde ?


Peki sen ne düşünüyorsun?

seni bu başlıkta görmek garip, kod tabanında yayınları olan bir insan.

 

beyler, bir siparişi başa baş olarak değiştirmek için kod nasıl yazılır.

stop 1 pp artıya sürüklenecek ve bir daha dokunmayacak şekilde yapmanız gerekiyor.

benim versiyonumda

               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 );

koşul her doğru olduğunda, sırayı değiştirmeniz gerektiği ortaya çıkıyor. lütfen bana nasıl yazacağımı söyle.

not.

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

Peki sen ne düşünüyorsun?

seni bu başlıkta görmek garip, kod tabanında yayınları olan bir insan.

Ayrıca sonucu test ettim - 2 sipariş açtım ve kârla kapatmadım ve bir tane daha açmadım.

Dolayısıyla bu seçenek uygun değil.

Fikirlerimi kod tabanında yayınladım ve deneyimli programcılar danışmanları sipariş etmek için bana yazdılar.

Her şeyden vazgeçiyorum - nereye iade edeceğimi bilmiyorum, her yere yerleştirmeye çalıştım.

 
Zhunko :

Bunlar, gösterge alt penceresinin dikey ölçeklemesini ayarlamak için kodun parçalarıdır.

Bu, yatay çizgileri ayarlamak için bir işlevdir. İşlev yalnızca gösterge kodundan çalışır. Kütüphaneden çalışmıyor.

Grafik nesnelerle çizimi kendiniz anlayın. Her şey bireyseldir.

Teşekkürler, çözmeye çalışacağım :)
 
alex12 :

Ayrıca sonucu test ettim - 2 sipariş açtım ve kârla kapatmadım ve bir tane daha açmadım.

Dolayısıyla bu seçenek uygun değil.

Bu yüzden ilk gönderime dönüyoruz - "... eksik TK"