[UYARI, KONU KAPALI!] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde. - sayfa 589

 

komut dosyaları danışmanlardan ayırt edilemez..

bazen #property show_inputs bir danışmanda olduğu gibi parametrelerle bir diyalog görüntülemek için komut dosyalarında kullanılır (elbette oradadır), ancak ayırt etmek zordur ..

 

Algoritmayı söyle.. Daha yüksek zaman diliminin en yüksek ve en düşük zamanlarını alttaki zaman diliminde bulmak gerekiyor.

   double H=iHigh( NULL ,TF2,i);
   double L=iLow( NULL ,TF2,i);  
   datetime timeH=
   datetime timeL=
 
zfs :

Algoritmayı söyle.. Daha yüksek zaman diliminin en yüksek ve en düşük zamanlarını alttaki zaman diliminde bulmak gerekiyor.

Hatırlayın veya hemen i - bulundu dizini kullanın.

Ve iTime (NULL, TF2, i) - zaman olacak.

 
Craft :

Sabaha kadar sürmedi. Biraz daha iyi oldu, ancak siparişlerden çiçek tarhlarının yeri kaçınılmazdı. Gerekli koşul altında tek bir sipariş vermeyi nasıl kaydedebilirim? Bahsettiğiniz: hayır, bu işe yaramaz. sadece siparişlerin tarihinin analizi yoluyla - bu nasıl yapılabilir veya başka ne uygulanabilir?

aşağı yukarı böyle

 int i,orders_total=OrdersTotal();

bool order_on_last_bar= false ;

if (orders_total> 0 ) //если есть ордера
{
   for (i=orders_total- 1 ;i>= 0 ;i--) //перебираем их все
   {
      OrderSelect(i,SELECT_BY_POS);
       if (iBarShift(OrderOpenTime())== 0 ) //если номер бара, соответствующего сремени открытия, равен 0
         order_on_last_bar= true ; //фиксируем этот факт
   }
}

if (order_on_last_bar== false ) // на нулевом баре нет открытых ордеров
{
   //делаем то что нам нужно
}
 

Zaten bir kere sordum, sonra gol attım ama şimdi yine böyle bir özelliğe ihtiyacım vardı, bir pozu açabilmek için maksimum hacim hesaplaması. şöyle yazıyorum:

 // Расчет максимального объема
   for ( double m = 0.1 ; AccountFreeMarginCheck( Symbol (),OP_SELL,m)> 30 ; m = m + 0.1 )
      {
       Max_lots   = m;
       double Ost = AccountFreeMarginCheck( Symbol (),OP_SELL,m);
      }

Ama Max_lots her zaman sıfıra eşittir... Belki birisi böyle bir çipi hesaplamak için daha yetkin bir tasarım biliyordur?

 
alsu :

aşağı yukarı böyle

iBarShift fonksiyonunun tüm değerlerini doldurdum (derleme daha önce küfür ediyordu), int i zaten yukarıda beyan edilmişti, bu tekrarı denedim ve kaldırdım ve deneyin saflığı için yerine j ile değiştirdim, çalışmasa bile - bazı barlarda çoklu açma/kapama emri alınır. Aşağıda açma koşulu olan kod var, belki bir şeyleri karıştırdım. Başka ne yapılabilir?

   int j,orders_total= OrdersTotal ();

bool order_on_last_bar=false;

if (orders_total> 0 ) //если есть ордера
{
   for (j=orders_total- 1 ;j>= 0 ;j--) //перебираем их все
   {
       OrderSelect (j,SELECT_BY_POS);
       if (iBarShift( NULL , 0 ,OrderOpenTime())== 0 ) //если номер бара, соответствующего времени открытия, равен 0
         order_on_last_bar=true; //фиксируем этот факт
   }
}

if (order_on_last_bar==false) // на нулевом баре нет открытых ордеров
{
while (true)                                   // Цикл закрытия орд.
     {
       if (Total== 0 && Opn_B==true)               // Открытых орд. нет +
        {                                       // критерий откр. Buy
         RefreshRates();                         // Обновление данных
         Alert ( "Попытка открыть Buy. Ожидание ответа.." );
         Ticket= OrderSend (Symb,OP_BUY,Lts,Ask, 2 , 0 , 0 ); //Открытие Buy
         if (Ticket > 0 )                         // Получилось :)
           {
             Alert ( "Открыт ордер Buy " ,Ticket);
             return ;                             // Выход из start()
           }
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
       if (Total== 0 && Opn_S==true)               // Открытых орд. нет +
        {                                       // критерий откр. Sell
         RefreshRates();                         // Обновление данных
         Alert ( "Попытка открыть Sell. Ожидание ответа.." );
         Ticket= OrderSend (Symb,OP_SELL,Lts,Bid, 2 , 0 , 0 ); //Открытие Sel
         if (Ticket > 0 )                         // Получилось :)
           {
             Alert ( "Открыт ордер Sell " ,Ticket);
             return ;                             // Выход из start()
           }
         if (Fun_Error( GetLastError ())== 1 )       // Обработка ошибок
             continue ;                           // Повторная попытка
         return ;                                 // Выход из start()
        }
       break ;                                     // Выход из while
     }
  }
 
Craft :

iBarShift fonksiyonunun tüm değerlerini doldurdum (derleme daha önce küfür ediyordu), int i zaten yukarıda beyan edilmişti, bu tekrarı denedim ve kaldırdım ve deneyin saflığı için yerine j ile değiştirdim, çalışmasa bile - bazı barlarda çoklu açma/kapama emri alınır. Aşağıda açma koşulu olan kod var, belki bir şeyleri karıştırdım. Başka ne yapılabilir?

1. Toplam değişkeni nedir, nereye bir değer atanır?

2. ikinci if(Toplam==0)'dan önce else if( koymak daha iyidir

 
alsu :

1. Toplam değişkeni nedir, nereye bir değer atanır?

Basit Uzman Danışman makalesinden bir örneğe dayanmaktadır: https://book.mql4.com/ru/samples/expert

 int start()
  {
   int
   Total,                           // Количество ордеров в окне 
...
   // Учёт ордеров
   Symb= Symbol ();                               // Название фин.инстр.
   Total= 0 ;                                     // Количество ордеров
   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()
           }
         Total++;                               // Счётчик рыночн. орд
         if (Total> 1 )                           // Не более одного орд
           {
             Alert ( "Несколько рыночных ордеров. Эксперт не работает." );
             return ;                             // Выход из start()
           }
         Ticket=OrderTicket();                   // Номер выбранн. орд.
         Tip   =OrderType();                     // Тип выбранного орд.
         Price =OrderOpenPrice();               // Цена выбранн. орд.
         SL    =OrderStopLoss();                 // SL выбранного орд.
         TP    =OrderTakeProfit();               // TP выбранного орд.
         Lot   =OrderLots();                     // Количество лотов
        }
     }
 

alsu :

2. ikinci if(Toplam==0)'dan önce else if( koymak daha iyidir

Yardım etmedi. alsu , rahatsız ettiğim için özür dilerim, ama bunu gerçekten çözmek istiyorum (konuyu sona erdirmek için).
 
Craft :
Yardım etmedi. alsu , rahatsız ettiğim için özür dilerim, ama bunu gerçekten çözmek istiyorum (konuyu sona erdirmek için).

tamam.

/* */ basit bir EA'dan bir kod parçası yorumlamayı deneyin ve Total'i kendimiz ilan ettiğimiz bir değişken olan order_total ile değiştirin.

Neden: