Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz, hiçbir yerde - 6. - sayfa 711

 
LBatters :

Merhaba)

Bir pozisyonun bir kısmını kapatmak için bir fonksiyon yazmaya çalıştım ama test cihazında çalıştırmaya başladığımda 138 hatası çıkıyor.Sorunun ne olduğunu anlamadım.Lütfen yardım edin.

İşte bu işlevin çalışması gereken danışman)

138 - "İstenen fiyat güncel değil veya teklif ve talep karışık."

Açılış/kapanış fiyatı yeniden hesaplanamaz, çünkü orada, ama işte bir felaket ( bir fiyat talep etmeniz ve buna MarketInfo kullanarak bir değer atamanız ve bunu başka bir değişkenle yeniden adlandırmanız gerekir ):

                 PriceCl     = NormalizeDouble ((takeprofit + OrderOpenPrice())/t, Digits );   //примерную цену закрытия
                 order = OrderTicket();     //получили ордер
                 if (Bid> PriceCl ) //если текущая цена оказалась выше нашей цены ,то закрываем часть ордера
                 {OrderClose(order, NormalizeDouble (lot*percent/ 100 , 2 ), PriceCl , 3 );}
 
7Konstantin7 :

Herkese merhaba.

Kim'in basit takip eden EA'sını eklemeye çalışıyorum, böylece tüm piyasa emirlerini kapattıktan sonra bekleyen emirleri siliyor, çalışmıyor(

siparişleri silmek için bir işlev ekledi:

Sonra, ustalaşma ihtimalim olmayan bir sorunla karşılaştım, kodlarda güçlü değilim.

Sanırım şöyle bir koşul yazmanız gerekiyor:

bu sadece başka bir EA'dan bir örnek


Bana yardım et lütfen.

Kostya, gerekli türlere göre sipariş sayısını hesaplamak için bir döngü oluştur, sonra istediğin gibi sil, akıllılık etme.
 
_new-rena :
Kostya, gerekli türlere göre sipariş sayısını hesaplamak için bir döngü yap, sonra istediğin gibi sil, akıllı olma.

Kodlarda acemiyim) Orada gecikmeler de ekledim, yardımcı olabilir)

   if (OrderType()==OP_BUY || OrderType()==OP_SELL || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP) {
 
7Konstantin7 :

Kodlarda acemiyim) Orada gecikmeler de ekledim, yardımcı olabilir)

Dedicated sorun değil. Sorun şu ki, gecikmeleri eklemeden önce "Ne verecek ???" diye düşünmeniz gerekiyordu. Ama hiçbir şey vermeyecek ... ve bunu eklemenin bir anlamı var mı ???

Geri kalanına gelince, anlamadım, sarhoşum ve Kim'in kodlarına saygı duymuyorum ... beni ara ...

 
AlexeyVik :

Dedicated sorun değil. Sorun şu ki, gecikmeleri eklemeden önce "Ne verecek ???" diye düşünmeniz gerekiyordu. Ama hiçbir şey vermeyecek ... ve bunu eklemenin bir anlamı var mı ???

Geri kalanına gelince, anlamadım, sarhoşum ve Kim'in kodlarına saygı duymuyorum ... beni ara ...

İşe yaramadı) Öyle düşündüm, bir şart yazmam lazım, oturup düşünüyorum.

Evet, gerçekler için kodları yok) en azından ücretsiz olanları, ücretli olanları bilmiyorum.

 
7Konstantin7 :

İşe yaramadı) Öyle düşündüm, bir şart yazmam lazım, oturup düşünüyorum.

Evet, gerçekler için kodları yok) en azından ücretsiz olanları, ücretli olanları bilmiyorum.

Gerçekte, her ayrı DC'nin kendi kodu vardır, bu nedenle evrensel bir kod bulamazsınız .. öncelikle asıl mesele, en azından demoda çalışmasıdır.

 

Sorunu çözdüm) uzun süre düşündüm) hepinize teşekkür ederim.

   if (gdProfit>BEGIN_PROFIT) {
    ClosePosFirstProfit();
     if (DeleteOrders) DeleteOrders();
  }
 

Merhaba!

Beş tabelada karşı siparişleri kapatırken bir sorunla karşılaştım. Sonuç olarak, toplam kâra ulaşıldığında kapatmam gerekiyor, diyelim ki satın alma başına 20 sipariş ve köy başına 33 sipariş. Aynı zamanda 20 alış ve 20 satış emrini OrderCloseBy() fonksiyonu ile kapatmak ve kalan 13 satış emrini OrderClose() fonksiyonu ile kapatmak istiyorum.

4. hanede sabit bir forma sahipsek kapanmada sorun yok ve OrderCloseBy() fonksiyonunu kullanırken formayı kaydediyoruz. Beş basamaklı spread'de spread dalgalanıyor, bu yüzden sanırım toplam kâra ulaşıldığında siparişler kapatılmıyor, ancak logda OrderCloseBy()'ye yemin ediyor. Aynı zamanda, test cihazında çalıştırırsanız, her şey normal şekilde kapanır.

Tek yönde verilen siparişler, toplam kâra ulaşıldığında sorunsuz bir şekilde kapatılır.

Bu sorunla karşılaşan var mı ve çözümleri nelerdir.

İşte emirleri kapatmak için fonksiyonlar.

   //-----------------------------------------------------------------------
   // функция подсчета открытых ордеров
   //-----------------------------------------------------------------------

   void OrderOpen()
   {
     Orders_BUY= 0 ; Orders_SELL= 0 ;
     for ( int a= 0 ; a<= OrdersTotal (); a++)
     {
       if ( OrderSelect (a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_BUY && OrderMagicNumber() == Magic) Orders_BUY=Orders_BUY+ 1 ;
       if ( OrderSelect (a,SELECT_BY_POS,MODE_TRADES) == true && OrderType()==OP_SELL && OrderMagicNumber() == Magic) Orders_SELL=Orders_SELL+ 1 ;

       //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_BUY) Orders_BUY=Orders_BUY+1;
       //if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES) && OrderType()==OP_SELL) Orders_SELL=Orders_SELL+1;
      ProfitAll=ProfitAll+OrderProfit()+OrderSwap()+OrderCommission();
     }
   }
  
   //-----------------------------------------------------------------------
   // функция закрытия ордеров сначала разнонаправленных
   //-----------------------------------------------------------------------
   void ClosePos()
   {
   int ticket_1= 0 , ticket_2= 0 ;
    
     for ( int a= 0 ; a<= OrdersTotal (); a++)
       {
         if ( OrderSelect (a,SELECT_BY_POS,MODE_TRADES) == true ) 
            {
             if (OrderSymbol()== Symbol () && OrderMagicNumber()==Magic) // проверка по символу и магику
               {
                 if (OrderType() == OP_BUY) ticket_1 = OrderTicket();
                 if (OrderType() == OP_SELL) ticket_2= OrderTicket();   
               } 
            }
        }    
       if (ticket_1 != 0 && ticket_2 != 0 ) {           // если найдены разнонаправленные ордера
      res = OrderCloseBy(ticket_1,ticket_2, clrRed ); }   // закроем их
       
       if (ticket_1 == 0 && ticket_2 != 0 ) {  CloseOrder_by_type(OP_SELL, Symbol ());  }
       if (ticket_1 != 0 && ticket_2 == 0 ) {  CloseOrder_by_type(OP_BUY, Symbol ());  }
    
    }

//---- Закрытие ордера по типу и комментарию ----//
void CloseOrder_by_type( int type, string sym)
{
   for ( int k= OrdersTotal ()- 1 ;k>= 0 ;k--)
   {
    
       if ( OrderSelect (k,SELECT_BY_POS,MODE_TRADES)== true )
       {
           
       if (type == OrderType() && sym==OrderSymbol()&& OrderMagicNumber()==Magic)
         if (OrderType()<= 1 ){ res = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(), 350 );}
         else { res = OrderDelete(OrderTicket());}
         if (!res)
               Print ( "Ошибка закрытия ордера. Код ошибки=" , GetLastError ());
             else
               Print ( "ордер успешно закрыт." );   
           
       }
   }
}  
 

Lütfen siparişleri açıldıkları sırayla nasıl kapatacağımı söyleyin.

Bu işlevi değiştirmek istiyorum:

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие позиций по рыночной цене сначала прибыльных           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit( string sy= "" , int op=- 1 , int mn=- 1 ) {
   int i, k= OrdersTotal ();
   if (sy== "0" ) sy= Symbol ();

   // Сначала закрываем прибыльные позиции
   for (i=k- 1 ; i>= 0 ; i--) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if ((OrderSymbol()==sy || sy== "" ) && (op< 0 || OrderType()==op)) {
         if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
           if (mn< 0 || OrderMagicNumber()==mn) {
             if (OrderProfit()+OrderSwap()> 0 ) ClosePosBySelect();
          }
        }
      }
    }
  }
   // Потом все остальные
  k= OrdersTotal ();
   for (i=k- 1 ; i>= 0 ; i--) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) {
       if ((OrderSymbol()==sy || sy== "" ) && (op< 0 || OrderType()==op)) {
         if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
           if (mn< 0 || OrderMagicNumber()==mn) ClosePosBySelect();
        }
      }
    }
  }
}
 
7Konstantin7 :

Lütfen siparişleri açıldıkları sırayla nasıl kapatacağımı söyleyin.

Bu işlevi değiştirmek istiyorum:

Cevabın kendisi kendini gösteriyor. Açık pozisyonları açılış saatlerine göre sıralayın. Ardından sıralanan dizideki listeye göre kapatın.