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

 

Lütfen söyleyin, sihirli sayının MM'de izlenmesi için koda " mn "yi doğru ekledim mi, eklemedim mi?

 //+----------------------------------------------------------------------------------------+
//| ММ Функция работает по принципу наращивания лота при увеличении                        |
//| депозита, и уменьшении лота при серии убыточных сделок лот возвращается                |
//| на начальный лот в данном случае 0.1 если происходит профит то следующий               |
//| лот расчитывается по прогресии.                                                        |
//| К примеру при депозите 500 старт лота будет равен 0.1 далее депозит                    |
//| увеличивается до 5000 лот будет равен 1 если будет две убыточные сделки                |
//| лот уменьшится от предыдущего деленое на DecreaseFactor = 3, если по далее             |
//| две сделки будут убыточные,уменьшится от предыдущего деленое на DecreaseFactor = 3,    |
//| далее если сделка будет прибыльной то следующий лот откроется из расчета               |
//| баланса депозита "баланс/500*0.1"=лот внешние переменные                               |
//+----------------------------------------------------------------------------------------+

double LotsOptimized() {
       double minlot = MarketInfo( Symbol (), MODE_MINLOT);
       double maxlot = MarketInfo( Symbol (), MODE_MAXLOT);       
       double lot = Lots;
       int orders = OrdersHistoryTotal();
       int losses = 0 ;
       lot = NormalizeDouble ((AccountFreeMargin()- AccountCredit()) * MaximumRisk / balans, 2 );
       if (DecreaseFactor > 0.0 ) {
for ( int i = orders - 1 ; i >= 0 ; i--) {
       if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY) == FALSE) {
       Print ( "Error in history!" );
       break ;
       }
if (OrderSymbol() != Symbol () || OrderType() > OP_SELL || OrderMagicNumber()!= mn ) continue ;
if (OrderProfit() > 0.0 ) break ; 
if (OrderProfit() < 0.0 ) losses++;
}
if (losses > 1 ) lot = NormalizeDouble (lot - lot * losses / DecreaseFactor, 2 );
}
if (lot < minlot) lot = minlot;
if (lot > maxlot) lot = maxlot; 
return (lot);} 
 
Danışmanın ayarlayabileceğim belirli bir zamanda açılması için Geçici "Durumu" söyle
 
Tüm siparişleri kapatan bir komut dosyası buldum, danışmana eklemek istiyorum, böyle bir koşula ihtiyacım var =(
 
Tiken123 :
Danışmanın ayarlayabileceğim belirli bir zamanda açılması için Geçici "Durumu" söyle
burada .
 
Teşekkürler!!
 
BeerGod :

Lütfen söyleyin, sihirli sayının MM cinsinden izlenmesi için koda " mn "yi doğru ekledim mi, eklemedim mi?

Magic, global bir değişken veya sabit olarak bildirilirse:

 int mn = ****;

ve böylece yapısal olarak hatasız (küçük sözdizimi düzenlemesi):

 double LotsOptimized()
{
     double minlot = MarketInfo ( Symbol (), MODE_MINLOT),
           maxlot = MarketInfo( Symbol (), MODE_MAXLOT),       
           lot = Lots, ld_Profit = 0.0 ;
     int     orders = OrdersHistoryTotal(), losses = 0 ;
//----
    lot = NormalizeDouble ((AccountFreeMargin() - AccountCredit()) * MaximumRisk / balans, 2 );
     if (DecreaseFactor > 0.0 )
    {
         for ( int i = orders - 1 ; i >= 0 ; i--)
        {
             if (! OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) { Print ( "Error in history!" ); break ;}
             if (OrderSymbol() != Symbol ()) continue ;
             if (OrderType() > OP_SELL) continue ;
             if (OrderMagicNumber() != mn) continue ;
             ld_Profit = OrderProfit();
             if (ld_Profit > 0.0 ) break ; 
             if (ld_Profit < 0.0 ) losses++;
        }
         if (losses > 1 ) lot = NormalizeDouble (lot - lot * losses / DecreaseFactor, 2 );
    }
     if (lot < minlot) lot = minlot;
     if (lot > maxlot) lot = maxlot; 
//----
     return (lot);
}

Parti, MODE_LOTSTEP'in çokluğu ile normalleştirilmelidir, aksi takdirde er ya da geç 131 (ERR_INVALID_TRADE_VOLUME) hatasıyla karşılaşırsınız.

Peki, fonksiyonda bildirilmeyen değişkenler vicdanınıza kalmış... :)

 
Bana nasıl yapacağımı söyle: Belirli bir siparişi kapattıktan sonra, doğru seviyede yeni bir tane ayarlayın. Böyle yazmaya çalıştım açılmıyor... Nasıl doğru yazılır?
 //-- Открытие ордеров  после закрытия
if   ( OrderSelect (Ticket_B,SELECT_BY_TICKET,MODE_TRADES)==false)
     {Ticket_B= 0 ;}
if   ( OrderSelect (Ticket_B_1,SELECT_BY_TICKET,MODE_TRADES)== false )
     {Ticket_B_1= 0 ;}
if   ( OrderSelect (Ticket_B_2,SELECT_BY_TICKET,MODE_TRADES)== false )
     {Ticket_B_2= 0 ;}

...

       if (Ticket_B== 0 )    // в этом месте пробовал и (Ticket_B<1), тоже никак
        {                                     
         SL=Bid - New_Stop(StopLoss)* Point ;     
         TP=Ask + New_Stop(TakeProfit)* Point ;   
         Alert ( "Попытка открыть Buy. Ожидание ответа.." );
         Ticket_B= OrderSend ( Symbol (),OP_BUY,Lts,Ask, 1 ,SL,TP, "121212" , 121212 , 0 , CLR_NONE );
         if (Ticket_B > 0 )                       
           {
             Alert ( "Открыт ордер Buy " ,Ticket_B);
             OrderSelect (Ticket_B,SELECT_BY_TICKET,MODE_TRADES);
            one_price=OrderOpenPrice();
         if (Fun_Error( GetLastError ())== 1 )     
             continue ;                           
         return ;                              
           }
        }
        
 
        
//-- Открытие ордеров -- BuyStop
       if (Up>= 1 && Ticket_B_1< 1 )
        {
         SL_1=SL;
         TP_1=one_price + StepUp* Point + New_Stop(TakeProfit)* Point ;
         Ticket_B_1= OrderSend ( Symbol (), OP_BUYSTOP, Lts, one_price + StepUp* Point , 1 , SL_1, TP_1, "121212" , 121212 , 0 , CLR_NONE );
           {
             Alert ( "Торговый приказ B2 отправлен на сервер. Ожидание ответа.." );
             if (Ticket_B_1> 0 )
              {
               Alert ( "Установлен ордер BuyStop " ,Ticket_B_1);
               }  
            }
         }
 

Merhaba,

Biraz profesyonel yardıma ihtiyacınız var...

Ben bile bu fikri hayata geçiremiyorum.. Her şeyi buldum, robota yerleştirdim gibi ama yine de olmuyor =(

Lütfen bir hata olup olmadığına bakın.

Toplam zarardan daha büyük bir toplam kara ulaşırken tüm karlı pozisyonların kapanmasını sağlamak istiyorum. Böyle bir koşul oluşturmaya çalışıyorum (Kar>Obytkov) Tüm karlı pozisyonları kapatın

 

Kod konusunda yardım. Koşul başarısız (Toplam Kar>Toplam Zarar) Tüm karlı işlemleri kapatın

Kaybedilen işlemleri "maksimum bakiye" anından itibaren sayması gerekir, daha sonra tüm kârlı işlemleri, tüm zarardan daha fazla bir kâra ulaştıklarında kapatmak ve yeni bir depo ile zaten yeniden kaybeden işlemleri saymaya başlamak için

Belki birisi mevduat bakiyesini izleyen bir danışmanla tanışmıştır, örneğin, 50 bakiye ile ticaret başlamıştır .. zararlar başlamıştır, danışman bakiyenin ne kadar düştüğünü hatırlamalıdır, böylece gelecekte, kar ne zaman Bu kayıptan daha fazla , tüm karlı işlemleri kapatmalı ve zararı yeniden saymaya başlamalıdır.

   if (GetProfitOpenPosInCurrency()>NumberOfLossPosToday()) 
   int slippage= 1 ;
   int ask, bid, open;
   double point;
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
       if (! OrderSelect (i,SELECT_BY_POS,MODE_TRADES)) break ;
       if (OrderType()==OP_BUY)
      {
         point=MarketInfo(OrderSymbol(),MODE_POINT);
         if (point== 0 ) break ;
         bid= MathRound (MarketInfo(OrderSymbol(),MODE_BID)/point);
         open= MathRound (OrderOpenPrice()/point);
         if (bid-open<Profit) continue ;
         OrderClose(OrderTicket(),OrderLots(),bid*point,slippage);
      }
       if (OrderType()==OP_SELL)
      {
         point=MarketInfo(OrderSymbol(),MODE_POINT);
         if (point== 0 ) break ;
         ask= MathRound (MarketInfo(OrderSymbol(),MODE_ASK)/point);
         open= MathRound (OrderOpenPrice()/point);
         if (open-ask<Profit) continue ;
         OrderClose (OrderTicket(),OrderLots(),ask*point,slippage);
      }
   }
}
//--------------------------------------------------------------------
double GetProfitOpenPosInCurrency( string sy= "" , int op=- 1 , int mn=- 1 ) {
   double p= 0 ;
   int     i, k= OrdersTotal ();

   if (sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; 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) {
            p+=OrderProfit()+OrderCommission()+OrderSwap();
          }
        }
      }
    }
  }
   return (p);
}
//--------------------------------------------------------------------
int NumberOfLossPosToday( string sy= "" , int op=- 1 , int mn=- 1 ) {
   datetime t;
   int       i, k=OrdersHistoryTotal(), kp= 0 ;

   if (sy== "0" ) sy= Symbol ();
   for (i= 0 ; i<k; i++) {
     if ( OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) {
       if (OrderSymbol()==sy || sy== "" ) {
         if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
           if (op< 0 || OrderType()==op) {
             if (mn< 0 || OrderMagicNumber()==mn) {
              t=OrderCloseTime();
               if (Year()==TimeYear(t) && DayOfYear()==TimeDayOfYear(t)) {
                 if (OrderProfit()< 0 ) kp++;
              }
            }
          }
        }
      }
    }
  }
   return (kp);
}
 

Ve son 1-2-3 siparişlerinin kârsız olduğunu nereden biliyorsun?

Ve genel olarak, son siparişin ne olduğunu nasıl öğrenebilirim?

Örneğin, bekleyen satın alma limitinin işe yarayıp yaramadığını ve eğer öyleyse, hangi fiyata olduğunu öğrenmem ve ardından yeni bir tane belirlemem gerekiyor.

Siparişin takip eden stop tarafından tetiklendiği nasıl anlaşılır ve takip tetiklendikten sonra yeni siparişler nasıl verilir?