Ücretsiz bir danışman yazacağım - sayfa 85

 
Evgenij Litvintsev :

Tünaydın! belki birisi stratejimi otomatikleştirmekle ilgilenir. Şimdi çalışıyor, ancak yarı otomatik modda otomatik olmasını istiyorum.


Ticaret sonuçlarını görebiliyor musunuz?

 

İyi akşamlar, lütfen bana tek bir fonksiyondan nasıl sipariş bileti, lot ve kar alabileceğinizi söyleyin.

double OldTicketSell()// En uzak satış emrini bulun

{
double MaxDist=0,oldprofit,lot;
int bilet=0;
double BID=MarketInfo(Symbol(),MODE_BID);
double ASK=MarketInfo(Symbol(),MODE_ASK);
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(Sipariş Seçimi(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderType()==OP_SELL && MaxDist<MathAbs(OrderOpenPrice()-ASK))
{
MaxDist=MathAbs(OrderOpenPrice()-ASK);
bilet=Bilet Siparişi();
eski kar = OrderProfit();
lot = OrderLots();
}
}
}
bilet iadesi);

}

İşlev açık, bulunan verilerin ondan nasıl çıkarılacağı açık değil veya lot ve kar altına kopyalamanız gerekiyor.


 
Николай :

İyi akşamlar, lütfen bana bir işlevden nasıl sipariş bileti, lot ve kar alabileceğinizi söyleyin.

İşlev açık, bulunan verilerin ondan nasıl çıkarılacağı açık değil veya lot ve kar altına kopyalamanız gerekiyor.

böyle olabilir mi

 struct InfoOrder
{
     int ticket;
     double lot,
            profit,
            swap,
            commission,
            sl, tp;
     datetime timeOpen;
     string comment;
} infoOrder;

void OldSell( void ) // Находим самый дальний ордер на продажу
{
   double MaxDist= 0 ;
   double BID= MarketInfo ( Symbol (), MODE_BID );
   double ASK= MarketInfo ( Symbol (), MODE_ASK );
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
   if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
      {
         if ( OrderType ()== OP_SELL && MaxDist< MathAbs ( OrderOpenPrice ()-ASK))
         {
             MaxDist= MathAbs ( OrderOpenPrice ()-ASK);
             infoOrder.ticket= OrderTicket ();
             infoOrder.profit = OrderProfit ();
             infoOrder.lot = OrderLots ();
         }
      }
   }
   return ; 
}
 
Konstantin Nikitin :

böyle olabilir mi

Hepsi harika ama ben bir çaydanlığım, bildiğim kadarıyla Uzman Danışman yazmaya çalışıyorum (biraz anladım), değişkenin bir yapı olduğunu anladım ama nasıl yapılacağı belli değil verileri bu yapıdan çıkarın. Örneğin, en uzak emri bulduk, sonra karı lota bölmemiz gerekiyor, mevcut fiyattan bu lota kadar olan puan sayısını alıyoruz. Sonra ters yöndeki mertebenin karını alırız (nasıl elde edileceğini biliyorum), bunu karşı mertebenin önceden hesaplanmış puan sayısına böleriz, lot sayısını alırız ve bu lot sayısı ile kapatıyoruz. tamamen veya kısmen uzak sipariş.
 
Konstantin Nikitin :

böyle olabilir mi

Bir de sormak istiyorum, döngüdeki emirlerin açılış fiyatlarını karşılaştırarak fiyattan en uzak emri bulmak mümkün müdür, sanırım bu şekilde daha da kolay olur?

 
Николай :

Bir de sormak istiyorum, döngüdeki emirlerin açılış fiyatlarını karşılaştırarak fiyattan en uzak emri bulmak mümkün müdür, sanırım bu şekilde daha da kolay olur?

Tabi ki yapabilirsin. Daha kolay olup olmadığı, neye ihtiyacınız olduğuna bağlıdır.
Peki, yukarıda sorduğunuz sorunun bir örneği.

 struct InfoOrder
{
     int ticket;
     double lot,
            profit,
            swap,
            commission,
            sl, tp;
     datetime timeOpen;
     string comment;
} infoOrder;

void OnTick ()
{
     OldSell();
     Print ( "Ticket: " , infoOrder.ticket);
     Print ( "Profit: " , infoOrder.profit);
     Print ( "Lot: " , infoOrder.lot);
     Print ( "-----=====-----" );
     
     return ;
}

void OldSell( void ) // Находим самый дальний ордер на продажу
{
   double MaxDist= 0 ;
   double BID= MarketInfo ( Symbol (), MODE_BID );
   double ASK= MarketInfo ( Symbol (), MODE_ASK );
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
   if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
      {
         if ( OrderType ()== OP_SELL && MaxDist< MathAbs ( OrderOpenPrice ()-ASK))
         {
             MaxDist= MathAbs ( OrderOpenPrice ()-ASK);
             infoOrder.ticket= OrderTicket ();
             infoOrder.profit = OrderProfit ();
             infoOrder.lot = OrderLots ();
         }
      }
   }
   return ; 
}
 
Konstantin Nikitin :

Tabi ki yapabilirsin. Daha kolay olup olmadığı, neye ihtiyacınız olduğuna bağlıdır.
Peki, yukarıda sorulan sorunuza bir örnek.

Bütün bunlara bakıyorum ve ne tür bir çaydanlık olduğumu anlıyorum. Yani void OldSell( void ) fonksiyonunun sonucunun InfoOrder yapısına yazıldığı ortaya çıkıyor ve ardından infoOrder.ticket, infoOrder.profit, infoOrder.lot değişkenlerinin elde edilen değerlerini kullanabilirsiniz. işlevi biraz genelleştirdi, doğru yaptı mı yapmadı mı?

//-Структура для нахождения самого дальнего ордера на продажу
struct InfoOrder
{
     int ticket;
     double lot,
            profit,
            swap,
            commission,
            sl, tp;
     datetime timeOpen;
     string comment;
} infoOrder;

void OnTick ()
{
     OldSell();
     Print ( "Ticketbuy: " , infoOrder.ticket);
     Print ( "Profitbuy: " , infoOrder.profit);
     Print ( "Lotbuy: " , infoOrder.lot);
     Print ( "Ticketsell: " , infoOrder.ticket);
     Print ( "Profitsell: " , infoOrder.profit);
     Print ( "Lotsell: " , infoOrder.lot);
     Print ( "-----=====-----" );
     
     return ;
}

void OldSell( void ) // Находим самый дальний ордер на продажу
{
   double MaxDist= 0 ;
   double BID= MarketInfo ( Symbol (), MODE_BID );
   double ASK= MarketInfo ( Symbol (), MODE_ASK );
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
   if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
      {
         if ( OrderType ()== OP_BUY && MaxDist< MathAbs ( OrderOpenPrice ()-BID))
          {
             MaxDist= MathAbs ( OrderOpenPrice ()-BID);
             infoOrder.ticketbuy= OrderTicket ();
             infoOrder.profitbuy = OrderProfit ();
             infoOrder.lotbuy = OrderLots ();
           }  
             
         if ( OrderType ()== OP_SELL && MaxDist< MathAbs ( OrderOpenPrice ()-ASK))
          {
             MaxDist= MathAbs ( OrderOpenPrice ()-ASK);
             infoOrder.ticketsell= OrderTicket ();
             infoOrder.profitsell = OrderProfit ();
             infoOrder.lotsell = OrderLots ();
          }
      }
   }
   return ; 
}


 
Konstantin Nikitin :

Tabi ki yapabilirsin. Daha kolay olup olmadığı, neye ihtiyacınız olduğuna bağlıdır.
Peki, yukarıda sorduğunuz sorunun bir örneği.

Değişkenleri değiştirmeyi unuttum Yazdır
 
Николай :
Bütün bunlara bakıyorum ve ne tür bir çaydanlık olduğumu anlıyorum. Yani void OldSell( void ) fonksiyonunun sonucunun InfoOrder yapısına yazıldığı ortaya çıkıyor ve ardından infoOrder.ticket, infoOrder.profit, infoOrder.lot değişkenlerinin elde edilen değerlerini kullanabilirsiniz. işlevi biraz genelleştirdi, doğru yaptı mı yapmadı mı?
 //-Структура для нахождения самого дальнего ордера на продажу
struct InfoOrder
{
     int ticket;
     double lot,
            profit,
            swap,
            commission,
            sl, tp,
            MaxDist;
     datetime timeOpen;
     string comment;
} infoOrder;

void OnTick ()
{
     if ( OldOrder( OP_BUY ) )
     {
         Print ( "Ticketbuy: " , infoOrder.ticket);
         Print ( "Profitbuy: " , infoOrder.profit);
         Print ( "Lotbuy: " , infoOrder.lot);
         Print ( "MaxDistbuy: " , infoOrder.MaxDist);
         Print ( "-----=====-----" );
     }
     if ( OldOrder( OP_SELL ) )
     {
         Print ( "Ticketsell: " , infoOrder.ticket);
         Print ( "Profitsell: " , infoOrder.profit);
         Print ( "Lotsell: " , infoOrder.lot);
         Print ( "MaxDistsell: " , infoOrder.MaxDist);
         Print ( "-----=====-----" );
     }
     
     return ;
}

bool OldOrder( const int type) // Находим самый дальний ордер на продажу
{
   bool res = false ;
   double MaxDist= 0 ;
   double BID= MarketInfo ( Symbol (), MODE_BID );
   double ASK= MarketInfo ( Symbol (), MODE_ASK );
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
   if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
      {
         switch (type)
           {
             case OP_BUY :
               if ( OrderType ()!= OP_BUY ) break ;
               if (MaxDist<= MathAbs ( OrderOpenPrice ()-BID)) break ;
               infoOrder.MaxDist= MathAbs ( OrderOpenPrice ()-BID);
               infoOrder.ticket= OrderTicket ();
               infoOrder.profit = OrderProfit ();
               infoOrder.lot = OrderLots ();
               res = true ;
               break ;
             
           case OP_SELL :
               if ( OrderType ()!= OP_SELL ) break ;
               if (MaxDist>= MathAbs ( OrderOpenPrice ()-ASK)) break ;
               infoOrder.MaxDist= MathAbs ( OrderOpenPrice ()-ASK);
               infoOrder.ticket= OrderTicket ();
               infoOrder.profit = OrderProfit ();
               infoOrder.lot = OrderLots ();
               res = true ;
               break ;
        }
      }
   }
   return res; 
}

Bunun gibi bir şey.
 




danışmanda böyle bir yapı buldum, bana neyi tanımladığını söyleme

 struct TMartinData
{
   int     BUY_Positions;
   double BUY_LastPrice;
   double BUY_StopPrice;
   double BUY_Lots;
   datetime BUY_LastTime;
   bool    BUY_AllWD;
   int     SELL_Positions;
   double SELL_LastPrice;
   double SELL_StopPrice;
   double SELL_Lots;
   datetime SELL_LastTime;
   bool    SELL_AllWD;
} MartinData;

void OnTick ()

void FillMartinData()
{
   datetime bfirst = TimeCurrent ()+ 1 ;
   datetime blast = 0 ;
   datetime sfirst = TimeCurrent ()+ 1 ;
   datetime slast = 0 ;
   MartinData.BUY_Positions = 0 ;
   MartinData.SELL_Positions = 0 ;
   MartinData.BUY_Lots = 0 ;
   MartinData.SELL_Lots = 0 ;
   MartinData.BUY_LastPrice = - 1 ;
   MartinData.SELL_LastPrice = - 1 ;
   MartinData.BUY_StopPrice = - 1 ;
   MartinData.SELL_StopPrice = - 1 ;
   MartinData.BUY_LastTime = 0 ;
   MartinData.SELL_LastTime = 0 ;
   MartinData.BUY_AllWD = true ;
   MartinData.SELL_AllWD = true ;
   for ( int i= 0 ;i< OrdersTotal ();i++)
   {
     if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES )== false ) break ;
     if ( OrderSymbol ()== Symbol () && OrderMagicNumber ()==MagicNum)
     {
         if ( OrderType ()== OP_BUY )
        {
           MartinData.BUY_Positions++;
           if ( OrderOpenTime ()<bfirst)
           {
              MartinData.BUY_Lots = OrderLots ();
              MartinData.BUY_StopPrice = OrderStopLoss ();
              bfirst = OrderOpenTime ();
           }
           if ( OrderOpenTime ()>blast)
           {
              MartinData.BUY_LastPrice = OrderOpenPrice ();
              blast = OrderOpenTime ();
           }
           if ( OrderStopLoss ()< OrderOpenPrice ())
              MartinData.BUY_AllWD = false ;
        }
         else if ( OrderType ()== OP_SELL )
        {
           MartinData.SELL_Positions++;
           if ( OrderOpenTime ()<sfirst)
           {
              MartinData.SELL_Lots = OrderLots ();
              MartinData.SELL_StopPrice = OrderStopLoss ();
              sfirst = OrderOpenTime ();
           }
           if ( OrderOpenTime ()>slast)
           {
              MartinData.SELL_LastPrice = OrderOpenPrice ();
              slast = OrderOpenTime ();
           }
           if (( OrderStopLoss ()== 0 ) || ( OrderStopLoss ()> OrderOpenPrice ()))
              MartinData.SELL_AllWD = false ;
        }
     }
   }
   MartinData.BUY_LastTime = blast;
   MartinData.SELL_LastTime = slast;
   if (MartinData.BUY_Positions== 0 ) MartinData.BUY_AllWD = false ;
   if (MartinData.SELL_Positions== 0 ) MartinData.SELL_AllWD = false ;
}