Allmänt meddelande

Collapse
No announcement yet.

Sekant Tangent

Collapse
X
 
  • Filter
  • Klockan
  • Show
Clear All
new posts

  • Sekant Tangent

    Hejsan,

    Tänkte skapa en ny strategi, som heter Sekant.
    Det verkar ligga något i att ta position, då tangenten till en kurva lutar ca 10grader, då tar vi position för uppgång, priset är elastiskt mot tiden SEK/tidsenhet. Derivatan är ett mått på förändringskvoten och ett mått på hur fort det går. K=dP/dT och pendlar mellan -2 till 2. Vi tar position då K=0.49 och när K är 2 tjänar vi mest pengar per timme. sedan avtar prisutvecklingen med tiden och tangenten börjar luta tillbaka igen. Vi går ur på samma tal vi gick in ca 10deg alltså 0.49 fast först efter att villkoret K har varit maximal, alltså 2. Det, som händer sedan är att Tangenten blir o d.v.s K=0 sedan K=-2 för att snart bli K=0 igen. Jag försöker sätta kod på detta och täljaren verkar funka, men hur läser man av tidsaxeln lättast?

    Vore kul att rita ut de röda pilarna och få en tangent med given längd att följa kurvan, ungefär, som en vagn på en räls..(se bild). @Henric Något för dig?

    https://www.youtube.com/watch?v=uFn77Xi9i98


    i20(
    { Grund Tid konto}
    öppet=ge(mult(1440,sub(market(c),frac(d))),130)
    okantal=eqv(portfolio(v),0)
    account_ok=not(eqv(cash(d),0))
    inpådagen=gt(frac(date()),div(8.25,24))
    Ma20=mov(c,20)
    { }
    Ma_1=mov(c,10,s)
    Ma_Putsat_1=Mov(Ma_1,3,s)
    Yref_1=Ref(c,Ma_Putsat_1)
    { Kurva P=f(t) Enhet:Krona/Tidsenhet }
    Delta_Y_1=Sub(0,Yref_1)
    Delta_X_1=Sub(0,10)
    DY_DX_1=Div(Delta_Y_1,Delta_X_1)
    Lutning_1=Atan(Delta_Y_1,Delta_X_1)

    {P2}
    PJN1=Aref(b,1)
    {T2}
    TJN1=xtime(d,h)

    {P}
    PX1F1=Aref(b,12)
    {T}
    TX1F1=xtime(d,h)

    {P1}
    P2XF=Aref(b,24)
    {T1}
    T2XF=xtime(d,h)

    {Likare till nedan Pris ekvation }
    {P=P2-P1}
    {P1=P2-P}
    {P2=P1+P}

    {Likare till nedan Tids ekvation }
    {T=T2-T1}
    {T1=T2-T}
    {T2=T1+T}
    { Pris ekvation }
    Delta_PJ=sub(PJN1,P2XF)
    Delta_P1=sub(PJN1,PX1F1)
    Delta_P2=add(P2XF,PX1F1)
    { Tids ekvation }
    Delta_TJ=sub(TJN1,T2XF)
    Delta_T1=sub(TJN1,TX1F1)
    Delta_T2=add(T2XF,TX1F1)
    {Ändringskvot K -2<=P<=2 -2<=T<=2}
    k1=div(Delta_PJ,Delta_TJ)
    k2=div(Delta_P1,Delta_T1)
    k3=div(Delta_P2,Delta_T2)
    {kvotens värde pendlar mellan -2 och 2 vi går in på 0.49 vilket är ungefär 10deg lutning uppåt på tangenten till kurvan }
    Kvot1=ge(k3,0.49)
    Kvot2=ge(k3,0)

    Kvot_Kurva=mov(kvot1,1,s)
    { Rita klimat och gränslinjer}
    draw(mult(DY_DX_1,100),1,bpeF)
    draw(mult(DY_DX_1,100),2,gpe)
    draw(mult(Lutning_1,100),3,dgpeF)
    draw(Kvot1,4,bsd)
    draw(mult(k2,100),5,gpd)
    draw(mult(k3,100),6,dgpdF)
    draw(Kvot_Kurva,8,bpd)
    draw(Ma20,7,dgpa)

    { Koppla ihop villkor Logik }
    köp1=and(and(eqv(portfolio(v),0),Kvot1),kvot2)
    köp2=and(and(köp1,öppet),inpådagen) { }
    köp3=and(and(köp2,account_ok),okantal)
    mult(köp3,100)
    )
    Attached Files
    Last edited by Martin Olsén; 2022-01-02, 10:37. Anledning: Taggade Henric

  • #2
    Köpte en kod på nätet, frågan är om det går att översätta den här till AT_Språk

    //+------------------------------------------------------------------+
    //| Angle of average.mq4 |
    //| mo |
    //+------------------------------------------------------------------+


    #property indicator_separate_window
    #property indicator_buffers 4
    #property indicator_color1 LimeGreen
    #property indicator_color2 Orange
    #property indicator_color3 DimGray
    #property indicator_color4 Gray
    #property indicator_width1 2
    #property indicator_width2 2
    #property indicator_width4 2


    //
    //
    //
    //
    //

    extern int NlmaPeriod = 14;
    extern int NlmaPrice = PRICE_CLOSE;
    extern double AngleLevel = 8;
    extern int AngleBars = 6;

    //
    //
    //
    //
    //

    double Buffer1[];
    double Buffer2[];
    double Buffer3[];
    double Buffer4[];

    int ChartScale,BarWidth;

    //+------------------------------------------------------------------+
    //| |
    //+------------------------------------------------------------------+
    //
    //
    //
    //
    //

    int init()
    {
    ChartScale = ChartScaleGet();
    if(ChartScale == 0) {BarWidth = 1;}
    else {if(ChartScale == 1) {BarWidth = 1;}
    else {if(ChartScale == 2) {BarWidth = 2;}
    else {if(ChartScale == 3) {BarWidth = 4;}
    else {if(ChartScale == 4) {BarWidth = 6;}
    else {BarWidth = 13;} }}}}

    SetIndexBuffer(0,Buffer1);
    SetIndexBuffer(1,Buffer2);
    SetIndexBuffer(2,Buffer3);
    SetIndexBuffer(3,Buffer4);
    SetIndexStyle(0,DRAW_HISTOGRAM,0, BarWidth);
    SetIndexStyle(1,DRAW_HISTOGRAM,0, BarWidth);
    SetIndexStyle(2,DRAW_HISTOGRAM,0, BarWidth);

    //
    //
    //
    //
    //
    SetLevelValue(0, AngleLevel);
    SetLevelValue(1,-AngleLevel);
    IndicatorShortName("angle of nlma ("+NlmaPeriod+","+DoubleToStr(AngleLevel,2)+","+AngleBars+")");
    IndicatorDigits(2);
    return(0);
    }


    //+------------------------------------------------------------------+
    //| |
    //+------------------------------------------------------------------+
    //
    //
    //
    //
    //

    #define Pi 3.141592653589793238462643

    //
    //
    //
    //
    //

    int start()
    {
    int countedBars = IndicatorCounted();
    if(countedBars<0) return(-1);
    if(countedBars>0) countedBars--;
    int limit = MathMin(Bars-countedBars,Bars-1);

    //
    //
    //
    //
    //

    for(int i=limit; i>=0; i--)
    {
    double range = iATR(NULL,0,AngleBars*20,i);
    double angle = 0.00;
    double price1 = iMA(NULL,0,1,0,MODE_SMA,NlmaPrice,i);
    double price2 = iMA(NULL,0,1,0,MODE_SMA,NlmaPrice,i+AngleBars);
    double change = iNonLagMa(price1,NlmaPeriod,i,0)-iNonLagMa(price2,NlmaPeriod,i,1);

    if (range != 0) angle = MathArctan(change/(range*AngleBars))*180.0/Pi;

    //
    //
    //
    //
    //

    Buffer1[i] = EMPTY_VALUE;
    Buffer2[i] = EMPTY_VALUE;
    Buffer3[i] = angle;
    Buffer4[i] = angle;
    if (angle > AngleLevel) { Buffer1[i] = angle; Buffer3[i] = EMPTY_VALUE;}
    if (angle < -AngleLevel) { Buffer2[i] = angle; Buffer3[i] = EMPTY_VALUE;}
    }
    return(0);
    }

    //-------------------------------------------------------------------
    //
    //-------------------------------------------------------------------
    //
    //
    //
    //
    //

    #define _length 0
    #define _len 1

    double nlmvalues[][2];
    double nlmprices[][2];
    double nlmalphas[][2];

    //
    //
    //
    //
    //

    double iNonLagMa(double price, double length, int r, int instanceNo=0)
    {
    r = Bars-r-1;
    if (ArrayRange(nlmprices,0) != Bars) ArrayResize(nlmprices,Bars);
    if (ArrayRange(nlmvalues,0) < instanceNo+1) ArrayResize(nlmvalues,instanceNo+1);
    nlmprices[r][instanceNo]=price;
    if (length<3 || r<3) return(nlmprices[r][instanceNo]);

    //
    //
    //
    //
    //

    if (nlmvalues[instanceNo][_length] != length || ArraySize(nlmalphas)==0)
    {
    double Cycle = 4.0;
    double Coeff = 3.0*Pi;
    int Phase = length-1;

    nlmvalues[instanceNo][_length] = length;
    nlmvalues[instanceNo][_len ] = length*4 + Phase;

    if (ArrayRange(nlmalphas,0) < nlmvalues[instanceNo][_len]) ArrayResize(nlmalphas,nlmvalues[instanceNo][_len]);
    for (int k=0; k<nlmvalues[instanceNo][_len]; k++)
    {
    if (k<=Phase-1)
    double t = 1.0 * k/(Phase-1);
    else t = 1.0 + (k-Phase+1)*(2.0*Cycle-1.0)/(Cycle*length-1.0);
    double beta = MathCos(Pi*t);
    double g = 1.0/(Coeff*t+1); if (t <= 0.5 ) g = 1;

    nlmalphas[k][instanceNo] = g * beta;
    }
    }

    //
    //
    //
    //
    //

    double sum = 0, sumw = 0;
    for (k=0; k < nlmvalues[instanceNo][_len] && (r-k)>=0; k++) { sum += nlmalphas[k][instanceNo]*nlmprices[r-k][instanceNo]; sumw += nlmalphas[k][instanceNo]; }
    if (sumw!=0)
    return(sum/sumw);
    else return(price);
    }

    //
    //
    //
    //
    //

    void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
    {
    ChartScale = ChartScaleGet();
    init();
    }

    //
    //
    //
    //
    //

    int ChartScaleGet()
    {
    long result = -1;
    ChartGetInteger(0,CHART_SCALE,0,result);
    return((int)result);
    }

    Comment


    • #3
      Spännande! Jag har gjort en del simuleringar i excel på börsdata mha derivata och hittat en del intressant. Orsaken till att jag köpte autostock var möjligheten till förfinade simuleringar. Har just börjat titta på hur systemet fungerar så är nybörjare, men följer gärna ditt projekt. Har du kommit fram till några specifika instrument som passar till den här typen av strategi?

      Comment


      • #4
        Ursprungligen postat av Martin Olsén Visa inlägg
        Hejsan,

        Tänkte skapa en ny strategi, som heter Sekant.
        Det verkar ligga något i att ta position, då tangenten till en kurva lutar ca 10grader, då tar vi position för uppgång, priset är elastiskt mot tiden SEK/tidsenhet. Derivatan är ett mått på förändringskvoten och ett mått på hur fort det går. K=dP/dT och pendlar mellan -2 till 2. Vi tar position då K=0.49 och när K är 2 tjänar vi mest pengar per timme. sedan avtar prisutvecklingen med tiden och tangenten börjar luta tillbaka igen. Vi går ur på samma tal vi gick in ca 10deg alltså 0.49 fast först efter att villkoret K har varit maximal, alltså 2. Det, som händer sedan är att Tangenten blir o d.v.s K=0 sedan K=-2 för att snart bli K=0 igen. Jag försöker sätta kod på detta och täljaren verkar funka, men hur läser man av tidsaxeln lättast?

        Vore kul att rita ut de röda pilarna och få en tangent med given längd att följa kurvan, ungefär, som en vagn på en räls..(se bild). @Henric Något för dig?

        https://www.youtube.com/watch?v=uFn77Xi9i98


        i20(
        { Grund Tid konto}
        öppet=ge(mult(1440,sub(market(c),frac(d))),130)
        okantal=eqv(portfolio(v),0)
        account_ok=not(eqv(cash(d),0))
        inpådagen=gt(frac(date()),div(8.25,24))
        Ma20=mov(c,20)
        { }
        Ma_1=mov(c,10,s)
        Ma_Putsat_1=Mov(Ma_1,3,s)
        Yref_1=Ref(c,Ma_Putsat_1)
        { Kurva P=f(t) Enhet:Krona/Tidsenhet }
        Delta_Y_1=Sub(0,Yref_1)
        Delta_X_1=Sub(0,10)
        DY_DX_1=Div(Delta_Y_1,Delta_X_1)
        Lutning_1=Atan(Delta_Y_1,Delta_X_1)

        {P2}
        PJN1=Aref(b,1)
        {T2}
        TJN1=xtime(d,h)

        {P}
        PX1F1=Aref(b,12)
        {T}
        TX1F1=xtime(d,h)

        {P1}
        P2XF=Aref(b,24)
        {T1}
        T2XF=xtime(d,h)

        {Likare till nedan Pris ekvation }
        {P=P2-P1}
        {P1=P2-P}
        {P2=P1+P}

        {Likare till nedan Tids ekvation }
        {T=T2-T1}
        {T1=T2-T}
        {T2=T1+T}
        { Pris ekvation }
        Delta_PJ=sub(PJN1,P2XF)
        Delta_P1=sub(PJN1,PX1F1)
        Delta_P2=add(P2XF,PX1F1)
        { Tids ekvation }
        Delta_TJ=sub(TJN1,T2XF)
        Delta_T1=sub(TJN1,TX1F1)
        Delta_T2=add(T2XF,TX1F1)
        {Ändringskvot K -2<=P<=2 -2<=T<=2}
        k1=div(Delta_PJ,Delta_TJ)
        k2=div(Delta_P1,Delta_T1)
        k3=div(Delta_P2,Delta_T2)
        {kvotens värde pendlar mellan -2 och 2 vi går in på 0.49 vilket är ungefär 10deg lutning uppåt på tangenten till kurvan }
        Kvot1=ge(k3,0.49)
        Kvot2=ge(k3,0)

        Kvot_Kurva=mov(kvot1,1,s)
        { Rita klimat och gränslinjer}
        draw(mult(DY_DX_1,100),1,bpeF)
        draw(mult(DY_DX_1,100),2,gpe)
        draw(mult(Lutning_1,100),3,dgpeF)
        draw(Kvot1,4,bsd)
        draw(mult(k2,100),5,gpd)
        draw(mult(k3,100),6,dgpdF)
        draw(Kvot_Kurva,8,bpd)
        draw(Ma20,7,dgpa)

        { Koppla ihop villkor Logik }
        köp1=and(and(eqv(portfolio(v),0),Kvot1),kvot2)
        köp2=and(and(köp1,öppet),inpådagen) { }
        köp3=and(and(köp2,account_ok),okantal)
        mult(köp3,100)
        )
        Varje stapel har en tid=d
        Den kan användas för att läsa av tiden. Värdet på d kan nås med olika funktioner som aref, find, etc. Det går tex att räkna antal perioder/staplar eller tidsskillnaden mellan två värden,
        Att rita en linje(pilar) för varje stapel som grafiskt i varje punkt ritar bakåt och framåt tror jag blir mycket svårt. Generellt ritas ett värde vid varje tidpunkt. Rikard eller någon annan kanske har en lösning.

        Comment

        Working...
        X