Prop ticareti - bir aldatmaca mı yoksa herhangi bir anlamı var mı? - sayfa 9

 
prostotrader :

Bu arada, bu 175 rubleyi nasıl hesaba katmayı önerirsiniz?

Tam olarak 3 ay içinde kalktıysanız ve son kullanma tarihi geçtiyse, 350 ruble düşürmeniz gerekir.

Çünkü depozito giderleri ancak hisselerde bir hareket (alış/satış) olduğunda alınır.

Ve herhangi bir nedenle aynı ayda çıktıysa (veya son kullanma ayına girdiyse), o zaman sadece 175 ruble düşürmeniz gerekir.

Danışman ne kadar çıkarılacağını nasıl anlayacak?

Katma

Ve sonra, bir çift için (Gelecekteki hisse senedi) çok büyük bir miktar olabilir ve 1000 çift için - küçük bir miktar olabilir.

Her şey ticaret durumlarının oluşma sıklığına bağlıdır. 175r'nin büyük bir depoda büyük bir rol oynamayacağını kabul ediyorum. Ancak herkesin büyük bir deposu yoktur.

Hemen şimdi bu komisyon dikkate alınmalıdır.

 
Alexey Kozitsyn :

Her şey ticaret durumlarının oluşma sıklığına bağlıdır. 175r'nin büyük bir depoda büyük bir rol oynamayacağını kabul ediyorum. Ancak herkesin büyük bir deposu yoktur.

Hemen şimdi bu komisyon dikkate alınmalıdır.

Neyin dikkate alınması gerektiği açıktır, ancak nasıl dikkate alınması gerekir?

 
prostotrader :

Neyin dikkate alınması gerektiği açıktır, ancak nasıl dikkate alınması gerekir?

Belki giriş sırasında bir kez 175r. Paranın uzun süre boşta durmayacağını ve çıkış ayı için tekrar girmeniz gerektiğini varsayarsak.

 
Alexey Kozitsyn :

Belki giriş sırasında bir kez 175r. Paranın uzun süre boşta durmayacağını ve çıkış ayı için tekrar girmeniz gerektiğini varsayarsak.

Mantıksal olarak, ancak o zaman faydaları nasıl dikkate almalı?

Yani vade bitimine kaç gün kala ve kaç adet kontrat satın alacağınızı bilmeniz gerekiyor,

çünkü giriş yüzdesi 1 çift için hesaplanmıştır

Katma

Şimdiye kadar bunu yapmaya karar verdim:

deponalog:= Settings.DepoNalog/(Settings.MaxFut * ExpData.FutData.Lot);
Settings.DepoNalog - 175 руб.



Settings.MaxFut - Предполагаемое кол-во фьючерсов продажи (на скрине 100)
ExpData.FutData.Lot - кол-во акций во фьючерсе
 
prostotrader :

Mantıklı, ancak o zaman faydaları nasıl dikkate almalı?

Yani vade bitimine kaç gün kala ve kaç adet kontrat satın alacağınızı bilmeniz gerekiyor,

çünkü giriş yüzdesi 1 çift için hesaplanmıştır

Katma

Şimdiye kadar bunu yapmaya karar verdim:

Başka bir seçenek var. Bir giriş parametresi olarak emanetçi komisyonunu yapmak kolaydır. Aynı anda birkaç pozisyon varsa, komisyonu dikkate alarak ilk pozisyonun karlılığını ve bu aydaki ikinci ve sonraki pozisyonları komisyonu hesaba katmadan hesaplayın.

 
prostotrader :

Mantıksal olarak, ancak o zaman faydaları nasıl dikkate almalı?

Yani vade bitimine kaç gün kala ve kaç adet kontrat satın alacağınızı bilmeniz gerekiyor,

çünkü giriş yüzdesi 1 çift için hesaplanmıştır

Evet, sözleşme sayısını bilmeniz ve 175'i bu değere eşit olarak genişletmeniz gerekir. Yine, komisyonun bu ayın başlarında dikkate alınmaması durumunda.

 

Bir şekilde ortaya çıkıyor

 //+------------------------------------------------------------------+
//|                                                    SPOTvsFUT.mq5 |
//|                                     Copyright 2019, prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, prostotrader"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots    2
//--- plot Label1
#property indicator_label1    "Input %"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrLime
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1
//--- plot Label2
#property indicator_label2    "Output %"
#property indicator_type2    DRAW_LINE
#property indicator_color2    clrAqua
#property indicator_style2    STYLE_SOLID
#property indicator_width2    1
//---
#define on_call - 111
#define YEAR     365
//---
input double StCB     = 7.5 ;     //Ставка ЦБ(%)
input double BBSpot   = 0.025 ;   //Брокер и Биржа СПОТ(%)
input double BrFut    = 0.24 ;   //Брокер ФОРТС(руб.)
input double BiFut    = 0.0066 ; //Биржа ФОРТС(%) 
input double BrExp    = 1.0 ;     //Брокер за эксп.(руб.) 
input double BiExp    = 2.0 ;     //Биржа за зксп.(руб.)
input double Div      = 0 ;       //Дивиденты(руб./акция)
input double NalogDiv = 13 ;     //Налог на дивиденты(%)
input double NalDepo  = 175 ;     //Комиссия депозитария (руб./мес.)
input long    NFut     = 100 ;     //Передп. кол-во фьючерсов к продаже
input int     aBars    = 40 ;     //Мин. Баров на графике  
//---
struct MARKET_DATA
{
   int exp_day;
   double spot_ask;
   double spot_bid;
   double fut_ask;
   double fut_bid;
   double fut_lot;
   double go_sell;
   double go_buy;
};
//---
string spot_symbol;
int event_cnt;
MARKET_DATA ma_data;
double inBuff[], outBuff[];
bool spot_book, fut_book;

//+------------------------------------------------------------------+
//| Custom indicator Get Spot name function                          |
//+------------------------------------------------------------------+
string GetSpot( const string fut_name)
{
   string Spot = "" ; 
   if (fut_name != "" )
  {
     int str_tire = StringFind (fut_name, "-" );
     if (str_tire > 0 )
    {
      Spot = StringSubstr (fut_name, 0 , str_tire);
       if (Spot == "GAZR" ) Spot = "GAZP" ; else
       if (Spot == "SBRF" ) Spot = "SBER" ; else
       if (Spot == "SBPR" ) Spot = "SBERP" ; else
       if (Spot == "TRNF" ) Spot = "TRNFP" ; else
       if (Spot == "NOTK" ) Spot = "NVTK" ; else
       if (Spot == "MTSI" ) Spot = "MTSS" ; else
       if (Spot == "GMKR" ) Spot = "GMKN" ; else
       if (Spot == "SNGR" ) Spot = "SNGS" ; else
       if (Spot == "Eu" )   Spot = "EURRUB_TOD" ; else
       if (Spot == "Si" )   Spot = "USDRUB_TOD" ; else
       if (Spot == "SNGP" ) Spot = "SNGSP" ;
    }
  }  
   return (Spot);
}
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
{
   int t_bars = Bars ( Symbol (), PERIOD_CURRENT );
   if (t_bars < (aBars + 2 ))
  {
     Alert ( "Не хватает баров на графике!" );
     return ( INIT_FAILED );
  }
  event_cnt = 0 ;
//---
  spot_symbol = GetSpot( Symbol ());
   if (spot_symbol == "" )
  {
     Alert ( "Не получено имя СПОТа!" );
     return ( INIT_FAILED );
  }
   else
  {
     if ( SymbolSelect (spot_symbol, true ) == false )
    {
       Alert ( "Нет смвола с именем " + spot_symbol + "!" );
       return ( INIT_FAILED );
    }
     else
    {
      spot_book = MarketBookAdd (spot_symbol);
       if (spot_book == false )
      {
         Alert ( "Не добавлен стакан СПОТа!" );
         return ( INIT_FAILED );
      }
    }
  }
  fut_book = MarketBookAdd ( Symbol ());
   if (spot_book == false )
  {
     Alert ( "Не добавлен стакан фьючерса!" );
     return ( INIT_FAILED );
  }   
   IndicatorSetInteger ( INDICATOR_DIGITS , 2 );
   IndicatorSetString ( INDICATOR_SHORTNAME , "SPOTvsFUT" );
//---  
   SetIndexBuffer ( 0 , inBuff, INDICATOR_DATA );
   PlotIndexSetDouble ( 0 , PLOT_EMPTY_VALUE , EMPTY_VALUE );
   ArraySetAsSeries (inBuff, true ); 
  
   SetIndexBuffer ( 1 , outBuff, INDICATOR_DATA );
   PlotIndexSetDouble ( 1 , PLOT_EMPTY_VALUE , EMPTY_VALUE );
   ArraySetAsSeries (outBuff, true );
  
     int window= ChartWindowFind ( ChartID (), "SPOTvsFUT" );
   ObjectCreate ( ChartID (), "SPOTvsFUT_1" , OBJ_LABEL ,window, 0 , 0 );
   ObjectSetInteger ( ChartID (), "SPOTvsFUT_1" , OBJPROP_YDISTANCE , 15 );
   ObjectSetInteger ( ChartID (), "SPOTvsFUT_1" , OBJPROP_XDISTANCE , 5 );
   ObjectSetInteger ( ChartID (), "SPOTvsFUT_1" , OBJPROP_COLOR , clrLime );
   ObjectSetString ( ChartID (), "SPOTvsFUT_1" , OBJPROP_TEXT , "Input: 0" );  

   ObjectCreate ( ChartID (), "SPOTvsFUT_2" , OBJ_LABEL ,window, 0 , 0 );
   ObjectSetInteger ( ChartID (), "SPOTvsFUT_2" , OBJPROP_YDISTANCE , 30 );
   ObjectSetInteger ( ChartID (), "SPOTvsFUT_2" , OBJPROP_XDISTANCE , 5 );
   ObjectSetInteger ( ChartID (), "SPOTvsFUT_2" , OBJPROP_COLOR , clrAqua );
   ObjectSetString ( ChartID (), "SPOTvsFUT_2" , OBJPROP_TEXT , "Output: 0" );
//---  
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
// Custom indicator DeInit function                                  |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   ObjectDelete ( ChartID (), "SPOTvsFUT_1" );
   ObjectDelete ( ChartID (), "SPOTvsFUT_2" );
   if (fut_book == true ) MarketBookRelease ( Symbol ());
   if (spot_book == true ) MarketBookRelease (spot_symbol);
   if (reason == REASON_INITFAILED )
  {
     Print ( "Индикатор удалён! Причина - ошибка инициализации." );
     string short_name = ChartIndicatorName ( ChartID (), 1 , 0 );
     ChartIndicatorDelete ( ChartID (), 1 , short_name); 
  }
}
//+------------------------------------------------------------------+
//| Custom indicator Get expiration  function                        |
//+------------------------------------------------------------------+   
int GetExpiration( const string aSymbol)
{
   MqlDateTime ExpData, CurData;
   datetime expir_time = datetime ( SymbolInfoInteger (aSymbol, SYMBOL_EXPIRATION_TIME ));
   TimeToStruct (expir_time, ExpData);
   TimeTradeServer (CurData);
   if (ExpData.year != CurData.year)
  {
     return (YEAR * (ExpData.year - CurData.year) - CurData.day_of_year + ExpData.day_of_year);
  }
   else
  {
     return (ExpData.day_of_year - CurData.day_of_year);
  }
}
//+------------------------------------------------------------------+
// Custom indicator On book event function                           |
//+------------------------------------------------------------------+
void OnBookEvent ( const string & symbol)
{
   if ((symbol == Symbol ()) || (symbol == spot_symbol))
  {
    ma_data.exp_day  = GetExpiration( Symbol ());
    ma_data.fut_ask  = SymbolInfoDouble ( Symbol (), SYMBOL_ASK );
    ma_data.fut_bid  = SymbolInfoDouble ( Symbol (), SYMBOL_BID );
    ma_data.fut_lot  = SymbolInfoDouble ( Symbol (), SYMBOL_TRADE_CONTRACT_SIZE );
    ma_data.go_sell  = SymbolInfoDouble ( Symbol (), SYMBOL_MARGIN_INITIAL );
    ma_data.go_buy  = SymbolInfoDouble ( Symbol (), SYMBOL_MARGIN_MAINTENANCE );
    ma_data.spot_ask = SymbolInfoDouble (spot_symbol, SYMBOL_ASK );
    ma_data.spot_bid = SymbolInfoDouble (spot_symbol, SYMBOL_BID );
//---    
     double price[]; 
     OnCalculate (event_cnt, event_cnt, on_call, price); 
  }
}
//+------------------------------------------------------------------+
// Custom indicator Calc In Value function                           |
//+------------------------------------------------------------------+
double CalcInValue()
{
   double depocomiss = NalDepo/(NFut * ma_data.fut_lot);
   double comiss = ma_data.spot_ask * ma_data.fut_lot * BBSpot/ 100 * 2 +
                  BrFut + BiFut * ma_data.fut_bid/ 100 + BrExp + BiExp;
   double divNalog = Div/ 100 * 13 ;
   double divWaite = 0 ;
   if (Div > 0 ) divWaite = ((Div - divNalog) * ma_data.fut_lot * 13 / 100 / 365 * 20 );
   //--- TODO ---
   return ( 0 );
}
//+------------------------------------------------------------------+
// Custom indicator Calc Out Value function                          |
//+------------------------------------------------------------------+
double CalcOutValue()
{
   double comiss = ma_data.spot_bid * ma_data.fut_lot * BBSpot/ 100 +
                   BrFut + BiFut * ma_data.fut_ask/ 100 ;
   //--- TODO ---
   return ( 0 );

}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double &price[])
{
   if (prev_calculated == 0 )
  {
     ArrayInitialize (inBuff, EMPTY_VALUE );
     ArrayInitialize (outBuff, EMPTY_VALUE );
  }  
//---  
   if (begin == on_call)
  {
     for ( int i = aBars - 1 ; i > 0 ; i--)
    {
      inBuff[i] = inBuff[i - 1 ];
      outBuff[i] = outBuff[i - 1 ];
    }
    inBuff[ 0 ] = CalcInValue(); 
    outBuff[ 0 ] = CalcOutValue();
  }
   else
  {
    inBuff[ 0 ] = inBuff[ 1 ];
    outBuff[ 0 ] = outBuff[ 1 ];
  }
  inBuff[aBars] = EMPTY_VALUE ;
  outBuff[aBars] = EMPTY_VALUE ;
   ObjectSetString ( ChartID (), "SPOTvsFUT_1" , OBJPROP_TEXT , "Input: " + DoubleToString (inBuff[ 0 ], 2 ));
   ObjectSetString ( ChartID (), "SPOTvsFUT_2" , OBJPROP_TEXT , "Output: " + DoubleToString (outBuff[ 0 ], 2 ));
   ChartRedraw ( ChartID ());
//--- return value of prev_calculated for next call
  event_cnt = rates_total;
   return (rates_total);
}
//+------------------------------------------------------------------+
 
prostotrader :

Bir şekilde ortaya çıkıyor

Arbitraj konusunun eksiksiz ve kapsamlı bir çalışması için, ekranı iki tür yapmanız gerektiğini düşünüyorum: çünkü + bilgi güncellemeleri arasında bir milisaniyelik fark ekleyin ve ayrıca genel resmi değerlendirmek için bir şamdan şeklinde karlılık.

Bunun gibi bir şey (petrol için takvim):


 
Alexey Kozitsyn :

Arbitraj konusunun eksiksiz ve kapsamlı bir çalışması için, ekranı iki tür yapmanız gerektiğini düşünüyorum: çünkü + bilgi güncellemeleri arasında bir milisaniyelik fark ekleyin ve ayrıca genel resmi değerlendirmek için bir şamdan şeklinde karlılık.

İki sipariş defteri, düşük likit vadeli işlemler için bile çok hızlı çalışır, SPOT'lar büyük bir hızla "harman yapar"

 if ((symbol == Symbol ()) || (symbol == spot_symbol ))

Katma

"Div avcısı" stratejisinin amacı, risk almadan hisse senedi alıp vadeli işlem satmamızdır.

Temettü yakaladıysak, temettü ve girdiğimiz yüzdeyi alırız.

Piyasa uzun süredir oturmuş durumda ve Merkez Bankası'nın yıllık %7,5 faiz oranıyla %10-15'i yakalamak mümkün değil.

 
prostotrader :

İki sipariş defteri, düşük likit vadeli işlemler için bile çok hızlı çalışır, SPOT'lar büyük bir hızla "harman yapar"

Girmek için, bizi iyi fiyatlarla içeri alıp almayacaklarını anlamamız gerekiyor, o zaman ms'ye ihtiyacımız var (sanırım). Ayrıca, gerçek zamanlı olarak yoğunluğu camdan görmek güzel olurdu (uzak gelecekler için).