MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1950

 
Valeriy Yastremskiy # :

yapınızda saklayın veya gerekli fiyatları biletler ile sıralayın ve başka neye ihtiyacınız varsa, örneğin zaman ve fiyata göre ekledikten sonra hemen sıralayın. Kaynaklara göre, nadiren arama yaparsanız, aynı veya biraz daha pahalıdır ve sık sık ise hatırlamak daha iyidir. Tabii 100500 siparişiniz yoksa) O zaman pahalı da olabilir. Genel olarak, bir yapıda veya çok boyutlu bir dizide sıralama yapıldığında, sorun maalesef sadece ilk indeks için çözülür.

Bazen aynı indekslere, biletlere, zamana ve fiyatlara sahip birkaç tek boyutlu dizi kullanırım. Ve gerekli özelliğin bir dizininde arama yapın. Örneğin daha kısa bir süre veya daha yüksek bir fiyat endeksi alırız ve gerekli siparişin biletini alırız. Elbette koltuk değneği, ama açıkça işe yarıyor.

ps. ben de bakayım...
 
Valeriy Yastremskiy # :

yapınızda saklayın veya gerekli fiyatları biletler ile sıralayın ve başka neye ihtiyacınız varsa, örneğin zaman ve fiyata göre ekledikten sonra hemen sıralayın. Kaynaklara göre, nadiren arama yaparsanız, aynı veya biraz daha pahalıdır ve sık sık ise hatırlamak daha iyidir. Tabii 100500 siparişiniz yoksa) O zaman pahalı da olabilir. Genel olarak, bir yapıda veya çok boyutlu bir dizide sıralama yapıldığında, sorun maalesef sadece ilk indeks için çözülür.

Bazen aynı indekslere, biletlere, zamana ve fiyatlara sahip birkaç tek boyutlu dizi kullanırım. Ve gerekli özelliğin bir dizininde arama yapın. Örneğin daha kısa bir süre veya daha yüksek bir fiyat endeksi alırız ve gerekli siparişin biletini alırız. Elbette koltuk değneği, ama açıkça işe yarıyor.

Ben böyle yaptım:

enum MT_ORD_STATE
  {
   ORD_NA,  // Not available
   ORD_SENT,
   ORD_ACTIVE,
   ORD_CHANGE_SENT,
   ORD_DEL_SENT
  };

struct MTOrder
  {
   ulong id;
   ulong Ticket;
   datetime Time;
   datetime TimeNotFound;
   double   Price;
   double   Vol;
   double   VolInit;
   uint     request_id;
   ENUM_ORDER_TYPE   Type;
   ENUM_ORDER_STATE State;
   MT_ORD_STATE MTState;
   int      Reserved;
   bool     Idf; // Identified
  };

...

   MTOrder  Orders[]; // С начала массива - ордера на покупку, по убыванию цены,
                       // С конца - на продажу, по возрастанию

Dizi her zaman sıralanır, istenen noktaya yeni bir sıra eklenir, diğer siparişlerin kayması ile bir sipariş silindiğinde bir kaydırma meydana gelir.

Ama MT5'te

 
JRandomTrader # :

Ben böyle yaptım:

Dizi her zaman sıralanır, istenen noktaya yeni bir sıra eklenir, diğer siparişlerin kayması ile bir sipariş silindiğinde bir kaydırma meydana gelir.

Ama MT5'te

Yazarken, silerken ve sıralarken bir shift koduna sahip olmak güzel olurdu. Bir dizi yapıyı alanlara göre sıralamak benim için önemsiz bir iş değil. Evet ve ayrıca değişir.)

 
Valeriy Yastremskiy # :

Yazarken, silerken ve sıralarken bir shift koduna sahip olmak güzel olurdu. Bir dizi yapıyı alanlara göre sıralamak benim için önemsiz bir iş değil. Evet ve ayrıca değişir.)

 bool Tr2MT::InsertOrder(MTOrder &ord_tmp) // Из AddOrder (2 варианта), единственное место добавления ордеров в массив
{
 int i= 0 ,n= 0 ;
 string str= "" ;
 ord_tmp.id=++st.LastOrdID;

 switch (ord_tmp.Type)
   {
     case ORDER_TYPE_BUY :
     case ORDER_TYPE_BUY_LIMIT :
       for (i= 0 ,n=- 1 ;i< ArraySize (Orders);i++)
        {
         if (Orders[i].id== 0 )
           {
            n=i; break ;
           }
        }
       if (n< 0 ) break ;
       for (i=n;i>= 0 ;i--)
        {
         if (i== 0 || Orders[i- 1 ].Price>=ord_tmp.Price)
           {
            Orders[i]=ord_tmp;
            SaveState();
             //str=OrdString();
             //Log(str);
             return true ; //добавили
           }
         else
           {
            Orders[i]=Orders[i- 1 ];
           }
        }
       break ;
     case ORDER_TYPE_SELL :
     case ORDER_TYPE_SELL_LIMIT :
       for (i= ArraySize (Orders)- 1 ,n=- 1 ;i>= 0 ;i--)
        {
         if (Orders[i].id== 0 )
           {
            n=i;
             break ;
           }
        }
       if (n< 0 ) break ;
       for (i=n;i< ArraySize (Orders);i++)
        {
         if (i== ArraySize (Orders)- 1 || Orders[i+ 1 ].Price<=ord_tmp.Price)
           {
            Orders[i]=ord_tmp;
            SaveState();
             //str=OrdString();
             //Log(str);
             return true ; //добавили
           }
         else
           {
            Orders[i]=Orders[i+ 1 ];
           }
        }
       break ;
     default :
       return false ;
       break ;
   }
 str= "Can't add order - out of array!" ;
 ErrLog(str);
 return false ; //не нашли места для ордера
}
bool Tr2MT::DelOrder( int n)
{
 int i;
 MTOrder ord_tmp={};

       switch (Orders[n].Type)
         {
           case ORDER_TYPE_BUY :
           case ORDER_TYPE_BUY_LIMIT :
             for (i=n;i< ArraySize (Orders);i++)
              {
               if (i== ArraySize (Orders)- 1 || Orders[i+ 1 ].id== 0 || Orders[i+ 1 ].Price>Orders[i].Price)
                 {
                  Orders[i]=ord_tmp; // Обнуляем
                   break ;
                 }
               else
                 {
                  Orders[i]=Orders[i+ 1 ];
                 }
              }
             break ;
           case ORDER_TYPE_SELL :
           case ORDER_TYPE_SELL_LIMIT :
             for (i=n;i>= 0 ;i--)
              {
               if (i== 0 || Orders[i- 1 ].id== 0 || Orders[i- 1 ].Price<Orders[i].Price)
                 {
                  Orders[i]=ord_tmp; // Обнуляем
                   break ;
                 }
               else
                 {
                  Orders[i]=Orders[i- 1 ];
                 }
              }
             break ;
           default :
             return false ;
             break ;
         }
 return true ;
}

Ve belki de en ilginç olanı:

 bool Tr2MT::UpdOrder( int n) // Только если есть тикет или угадываем
{
 string str;
 int i;
 bool flag= false ;
 MTOrder ord_tmp={ 0 };
 ulong ticket=Orders[n].Ticket;

 if (ticket== 0 )
   {
     if (!GuessOrdTicket(n)) return false ; // Если угадываем - он будет в Orders[n].Ticket
     else ticket=Orders[n].Ticket;
   }

 switch (FindOrder(ticket,Orders[n].Time+ 100000 ))
   {
     case ORD_FOUND: //изменён или просто проверка
       //update (sync) order
       if (Orders[n].Price== OrderGetDouble ( ORDER_PRICE_OPEN )) // Цена не изменилась
        {
         if (Orders[n].State==( ENUM_ORDER_STATE ) OrderGetInteger ( ORDER_STATE )&&Orders[n].MTState!=ORD_NA)
           {
             if (Orders[n].Vol== OrderGetDouble ( ORDER_VOLUME_CURRENT ))
               return true ; // Не нужно сохранять состояние, можно сразу выйти
             else
               Orders[n].Vol= OrderGetDouble ( ORDER_VOLUME_CURRENT );
           }
         else
           {
             //Orders[n].State=(ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE);
            SetOrdState(Orders[n],( ENUM_ORDER_STATE ) OrderGetInteger ( ORDER_STATE )); // Обнулит и TimeNotFound
             if (Orders[n].Vol!= OrderGetDouble ( ORDER_VOLUME_CURRENT ))
               Orders[n].Vol= OrderGetDouble ( ORDER_VOLUME_CURRENT );
           }
        }
       else // Цена изменилась
        {
         ord_tmp=Orders[n];
         //ord_tmp.State=(ENUM_ORDER_STATE)OrderGetInteger(ORDER_STATE);
         SetOrdState(ord_tmp,( ENUM_ORDER_STATE ) OrderGetInteger ( ORDER_STATE ));
         ord_tmp.Price= OrderGetDouble ( ORDER_PRICE_OPEN );
         ord_tmp.Vol= OrderGetDouble ( ORDER_VOLUME_CURRENT );
         switch (Orders[n].Type)
           {
             case ORDER_TYPE_BUY :
             case ORDER_TYPE_BUY_LIMIT :
               if (ord_tmp.Price>Orders[n].Price) // Цена ордера увеличилась, перемещаем вверх (по массиву - вниз)
                 {
                   for (i=n;i>= 0 ;i--)
                    {
                     if (i== 0 // Конец массива ордеров
                        || ord_tmp.Price<=Orders[i- 1 ].Price) // Следующий - по большей цене, вставляем перед ним
                       {
                        Orders[i]=ord_tmp;
                         break ;
                       }
                     else
                       {
                        Orders[i]=Orders[i- 1 ]; // Сдвигаем следующий элемент
                       }
                    }
                 }
               else // Цена ордера умньшилась, перемещаем вниз (по массиву - вверх)
                 {
                   for (i=n;i< ArraySize (Orders);i++)
                    {
                     if (i== ArraySize (Orders)- 1 // Конец массива ордеров
                        || Orders[i+ 1 ].Ticket== 0 // Следующий элемент пустой
                        || ord_tmp.Price>Orders[i+ 1 ].Price // Следующий - по меньшей цене, вставляем перед ним
                        || Orders[i+ 1 ].Price>Orders[i].Price) // Следующий - ордер уже на продажу
                       {
                        Orders[i]=ord_tmp;
                         break ;
                       }
                     else
                       {
                        Orders[i]=Orders[i+ 1 ]; // Сдвигаем следующий элемент
                       }
                    }
                 }
               break ;
             case ORDER_TYPE_SELL :
             case ORDER_TYPE_SELL_LIMIT :
               if (ord_tmp.Price>Orders[n].Price) // Цена ордера увеличилась, перемещаем вверх (по массиву - вниз)
                 {
                   for (i=n;i>= 0 ;i--)
                    {
                     if (i== 0 // Конец массива ордеров
                        || Orders[i- 1 ].Ticket== 0 // Следующий элемент пустой
                        || ord_tmp.Price<Orders[i- 1 ].Price // Следующий - по большей цене, вставляем перед ним
                        || Orders[i- 1 ].Price<Orders[i].Price) // Следующий - ордер уже на покупку
                       {
                        Orders[i]=ord_tmp;
                         break ;
                       }
                     else
                       {
                        Orders[i]=Orders[i- 1 ]; // Сдвигаем следующий элемент
                       }
                    }
                 }
               else // Цена ордера умньшилась, перемещаем вниз (по массиву - вверх)
                 {
                   for (i=n;i< ArraySize (Orders);i++)
                    {
                     if (i== ArraySize (Orders)- 1 // Конец массива ордеров
                        || ord_tmp.Price>Orders[i+ 1 ].Price) // Следующий - по меньшей цене, вставляем перед ним
                       {
                        Orders[i]=ord_tmp;
                         break ;
                       }
                     else
                       {
                        Orders[i]=Orders[i+ 1 ]; // Сдвигаем следующий элемент
                       }
                    }
                 }
               break ;
             default :
               return false ;
               break ;
           }
        }
      SaveState();
       //str=OrdString();
       //Log(str);
       break ;
     case ORD_HIST_FOUND: //исполнен || снят
       //delete order
       if (!DelOrder(n))
         return false ;
      SaveState();
      str=OrdHistString(ticket); // Уточнить
      Log(str);
       break ;
     case ORD_NOT_FOUND: //отправлен в историю?
       if (Orders[n].MTState!=ORD_NA)
        {
         Orders[n].MTState=ORD_NA;
         Orders[n].TimeNotFound= TimeCurrent ();
         SaveState();
         printf ( __FUNCTION__ , "Order not found, ticket:" , IntegerToString (Orders[n].Ticket), " TimeNF:" , TimeToString (Orders[n].TimeNotFound, TIME_SECONDS ));
        }
       else
        {
         if ( TimeCurrent ()-Orders[n].TimeNotFound> 60 ) // > 60 секунд не найден
           {
             if (!DelOrder(n))
               return false ;
            SaveState();
            str= "Order not found >60s " + IntegerToString (ticket)+ "\n" ;
            Log(str);
           }
        }
       break ;
     default :
       return false ; //не тот ордер
       break ;
   }
 return true ;
}
 
JRandomTrader # :

Teşekkür ederim.

Fena değil. Dizileri sevmiyorum)))) ve asla dizilerde hata ayıklama yapılmadan tasarlanan şeyin ilk kez ortaya çıkması. ))) Özellikle vardiyalar, kopyalama, sıralama düzenli değil)))
 
Valeriy Yastremskiy # :

Teşekkür ederim.

Fena değil. Dizileri sevmiyorum)))) ve asla dizilerde hata ayıklama yapılmadan tasarlanan şeyin ilk kez ortaya çıkması. ))) Özellikle vardiyalar, kopyalama, sıralama düzenli değil)))

Her araç kendi için iyidir.

Ancak, sinsi bir hata kontrolü yapın ve tekrar kontrol edin))

 

Eski kodunuza yeni bir bakış bu anlama gelir!

Önceki versiyonun temelleri olan iki özdeş pervaz görüyorum.

Bir bariz tutarsızlık.

Ve modası geçmiş bir tasarım.

 
Merhaba. Adreste değilsem, nereye yazacağımı söyle. Teşekkür ederim.

Ayarlarda belirtilen kar zarara ulaşıldığında TÜM pozisyonları kapatacak ve ayarlarda belirtilen yönde hemen yeni pozisyonlar açacak ücretsiz bir MT5 danışmanı arıyorum. Biri konunun linkini verebilir mi?
Ya da belki piyasada açık pozisyon olmadığını görürse ve kapatmazsa sadece 1 pozisyon açan bir Uzman Danışmanınız var.
 

MT4 1353

Günlükte hangi hata görüntüleniyor?

Kod düzgün çalışıyor


 
Vitaly Muzichenko # :

MT4 1353

Günlükte hangi hata görüntüleniyor?

Kod düzgün çalışıyor


Görünüşe göre "yeni" ile oluşturulan bazı nesneler çıkışta yok edilmiyor.

Neden: