Prop-Trading - ist es ein Betrug oder ist es gut? - Seite 9

 
prostotrader:

Übrigens, wie wollen Sie diese 175 Rubel verbuchen?

Wenn er genau 3 Monate im Voraus ausgestellt wurde und am Ende der Laufzeit ausläuft, sollten 350 Rubel abgezogen werden.

Denn die Kosten für die Verwahrung werden nur dann berücksichtigt, wenn es Bewegungen in den Aktien gibt (Kauf/Verkauf).

Und wenn Sie aus irgendeinem Grund im selben Monat abgereist sind (oder in den Verfallsmonat eingetreten sind), dann müssen Sie nur 175 Rubel abziehen.

Wie wird der EA erkennen, wie viel er abziehen muss?

Hinzugefügt

Und dann, für ein Paar (Futures-Aktien) kann es eine riesige Menge sein, und für 1000 Paare - mizzero.

Es hängt alles von der Häufigkeit der Handelssituationen ab. Ich stimme zu, dass 175p bei einem großen Depot keine große Rolle spielen. Aber nicht jeder hat ein großes Depot.

Nun muss aber auch diese Kommission berücksichtigt werden.

 
Alexey Kozitsyn:

Es kommt darauf an, wie oft Handelssituationen auftreten. Ich stimme zu, dass 175 Pence bei einem großen Depot keinen großen Unterschied machen werden. Aber nicht jeder hat ein großes Depot.

Jetzt müssen wir nur noch diese Provision berücksichtigen.

Es ist klar, dass dies berücksichtigt werden muss, aber wie?

 
prostotrader:

Es ist verständlich, dass dies berücksichtigt werden muss, aber wie kann es berücksichtigt werden?

Vielleicht einmal 175 Pence zum Zeitpunkt der Eingabe. Das bedeutet, dass das Geld nicht lange ungenutzt bleibt und man im Monat des Ausstiegs wieder einsteigen muss.

 
Alexey Kozitsyn:

Vielleicht einmal 175 Pence zum Zeitpunkt der Eingabe. Das bedeutet, dass das Geld nicht lange untätig bleiben wird und für den Monat des Ausstiegs erneut eingesetzt werden muss.

Das macht Sinn, aber wie erklären Sie sich dann den Nutzen?

D.h. wir müssen wissen, wie viele Tage bis zum Verfall verbleiben und wie viele Kontrakte gekauft werden,

d.h. der %-Eintrag wird für 1 Paar berechnet

Hinzugefügt

Im Moment habe ich mich für Folgendes entschieden:

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



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

Das macht Sinn, aber wie erklären Sie sich dann den Nutzen?

D.h. Sie müssen wissen, wie viele Tage bis zum Verfall verbleiben und wie viele Kontrakte gekauft werden sollen,

weil der %-Eintrag für 1 Paar berechnet wird

Hinzugefügt

Für den Moment habe ich beschlossen, dies zu tun:

Es gibt noch eine weitere Variante. Machen Sie einfach die Provision des Einlegers zu einem Eingabeparameter. Wenn es mehrere Positionen zur gleichen Zeit, um die Rentabilität der ersten Position mit der Kommission zu berechnen, und die zweite und die folgenden Positionen in diesem Monat - ohne Berücksichtigung der Kommission.

 
prostotrader:

Das macht Sinn, aber wie erklären Sie sich dann den Nutzen?

D.h. Sie müssen wissen, wie viele Tage bis zum Verfall verbleiben und wie viele Kontrakte gekauft werden sollen,

weil der %-Eintrag auf 1 Paar berechnet wird.

Ja, Sie müssen die Anzahl der Verträge kennen und 175 gleichmäßig durch diesen Wert teilen. Wiederum für den Fall, dass die Provision nicht früher im Monat berücksichtigt wurde.

 

Sie lautet in etwa so

//+------------------------------------------------------------------+
//|                                                    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:

Sie lautet in etwa so

Ich denke, für eine vollständige, umfassende Studie der Arbitrage-Thema, müssen wir die Anzeige in zwei Ansichten zu machen: wie Sie haben + fügen Sie eine Millisekunde Unterschied zwischen Updates von Informationen, sowie in Candlestick-Ansicht, um das Gesamtbild der Rentabilität zu beurteilen.

Ungefähr so (Kalender für Öl):


 
Alexey Kozitsyn:

Ich glaube, dass wir für eine vollständige, umfassende Studie der Arbitrage zwei Ansichten anzeigen sollten: wie Ihre + fügen Sie eine Millisekunden-Differenz zwischen den Informations-Updates, sowie eine Candlestick-Ansicht, um das Gesamtbild der Rentabilität zu bewerten.

Zwei Brillen arbeiten sehr schnell, selbst bei illiquiden Termingeschäften SPOTs "flackern" mit großer Geschwindigkeit

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

Hinzugefügt

Der Sinn der "Div-Jäger"-Strategie besteht darin, dass wir ohne Risiko Aktien kaufen und Futures verkaufen.

Wenn wir eine Dividende erwischen, erhalten wir die Dividende und den Prozentsatz, zu dem wir eingestiegen sind.

Der Markt hat sich längst beruhigt, und zum Zentralbankzins von 7,5 % pro Jahr kann man keine 10-15 % bekommen.

 
prostotrader:

Zwei Gläser arbeiten sehr schnell, auch bei flüssigkeitsarmen Futures SPOTs "fuchteln" mit enormer Geschwindigkeit

Wir müssen wissen, ob wir zu guten Preisen einreisen dürfen, deshalb brauchen wir ms (glaube ich). Außerdem wäre es gut, die Dichte der Tasse in Echtzeit zu sehen (für langfristige Futures).