Is there any way to add code to cAlgo.API?

Created at 10 Feb 2017, 17:11
How’s your experience with the cTrader Platform?
Your feedback is crucial to cTrader's development. Please take a few seconds to share your opinion and help us improve your trading experience. Thanks!
fermjy's avatar

fermjy

Joined 23.07.2016

Is there any way to add code to cAlgo.API?
10 Feb 2017, 17:11


Hi guys, I'm new at this, I don't have too much experience, so forgive me if I make a disaster..

Well, I've been programming, and my custom methods, properties, etc... are making a mess of a code, having more than 1k of custom code.

So, the main question is: Can I add any Property to the, let's say cAlgo.API.dll? So when I start coding I already have my "things" included? Or..
I can create another DLL, and include it, but I have problems like..

Error    1    An object reference is required for the non-static field, method, or property 'cAlgo.API.Internals.Symbol.Ask.get' 

 Let's say that I have this code..

public class SpreadClass
    {

        public double Price
        {
            get { return Symbol.Ask - Symbol.Bid; }
        }

        public double Pips
        {
            get { return Price / Symbol.PipSize; }
        }

    }

So the previous error comes out.. even if I make It static..

Some people says "just pass the reference".. and I end with a code like this.. which... after a couple of houndred of lines.. It becomes a nightmare...... (the entire post is about avoiding this kind of code, one way or another)

public class SpreadClass
    {

        private Symbol BS;

        public SpreadClass(Robot robot)
        {
            BS = robot.Symbol;
        }

        public double Price
        {
            get { return BS.Ask - BS.Bid; }
        }

        public double Pips
        {
            get { return Price / BS.PipSize; }
        }

    }


If what I want is possible, is there any tutorial or post so I can learn how to avoid this "need of passing the reference"?
Modifying the cAlgo.API.dll would be awesome, for example I have to create the property "Entries".. because "Positions" can't be modified. If I can't change the default dll.. how can I do this with a custom DLL?


Ty for your patience and time.
Greetings.


@fermjy
Replies

mindbreaker
10 Feb 2017, 22:11

Hi,

look at this /api/guides/trading_api

use functions

using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
 
namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC)]
    public class NewcBot : Robot
    {
        [Parameter(DefaultValue = 0.0)]
        public double Parameter { get; set; }
 

        protected override void OnTick()
        {
            SayHello("JIMBO");
            if(SayHello("JIN") == "Baraki"){
               Print("Booooooo");
            }
        }
        

        /// !!!!!!!!!!!!!!!!!!!!!!!!!!!! YOUR CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    
        public string SayHello(string Name = "AlojzyBombel")
        {
            // Print to log
            Print("HELLO " + Name);

            // return value, string ...
            return "Baraki";
         }

    }
}

 

Or try decompile DLL for example with https://www.jetbrains.com/decompiler/

and see how they do it ;)

It C# search in google how to create dll library in visual studio on youtube and ....

Bye.

 


@mindbreaker

fermjy
10 Feb 2017, 22:22

RE:

mindbreaker said:

Hi,

look at this /api/guides/trading_api

use functions

using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
 
namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC)]
    public class NewcBot : Robot
    {
        [Parameter(DefaultValue = 0.0)]
        public double Parameter { get; set; }
 

        protected override void OnTick()
        {
            SayHello("JIMBO");
            if(SayHello("JIN") == "Baraki"){
               Print("Booooooo");
            }
        }
        

        /// !!!!!!!!!!!!!!!!!!!!!!!!!!!! YOUR CODE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!    
        public string SayHello(string Name = "AlojzyBombel")
        {
            // Print to log
            Print("HELLO " + Name);

            // return value, string ...
            return "Baraki";
         }

    }
}

 

Or try decompile DLL for example with https://www.jetbrains.com/decompiler/

and see how they do it ;)

It C# search in google how to create dll library in visual studio on youtube and ....

Bye.

 

I already have my code... thats what I'm saying... and I have almost 1k of lines... I don't want to put them in every cBot that I make... I prefer to do It loading a DLL... but I have that problem with reference for example... (I know hot to make a dll.. thank you for the google search)

If there is no way to change the cAlgo.API.dll... I will have to use my own DLL... but sooner or later... DLL or not... I have to pass the reference.. at least for what I know...
So If someone knows how to avoid this.. please help


@fermjy

mindbreaker
10 Feb 2017, 23:04

cAlgo create dll file

It's simple   :D

DLL class in visual studio (Boo.dll):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

// cAlgo.Api References
// using cAlgo.API.Collections;
// using cAlgo.API.Indicators;
// using cAlgo.API.Internals;
// using cAlgo.API.Requests;

namespace Boo
{
    public static class Class1
    {      
        public static double Price(double p1 = 100, double p2  = 200)
        {
            return p1 - p2;
        }

        public static  double Pips(double Price = 0)
        {
            return  Price;
        }
    }

}

And code in cBot (cAlgo):

using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;

// My dll name
using Boo;

namespace cAlgo
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class DLL : Robot
    {
        [Parameter(DefaultValue = 0.0)]
        public double Parameter { get; set; }

        protected override void OnStart()
        {
            // Put your initialization logic here
            Print(Boo.Class1.Price(666, 333));
        }
    }
}

It work in my cAlgo :)

Bye.


@mindbreaker

mindbreaker
10 Feb 2017, 23:21

And here your first example with cAlgo Api dll (you need include calgo api dll to your ddl as reference)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

// cAlgo.Api References
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.API.Requests;

namespace Boo
{
    public static class Class1
    {       
        public static double Price(Symbol my)
        {
            return my.Ask - my.Bid;
        }

        public static  double PipSize(Symbol my)
        {
            return  my.PipSize;
        }
    }

}

And in cbot:

using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
using Boo;

namespace cAlgo
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class DLL : Robot
    {
        [Parameter(DefaultValue = 0.0)]
        public double Parameter { get; set; }

        protected override void OnStart()
        {
            // Add Symbol
            Print(Boo.Class1.Price(Symbol));
        }
    }
}

And works fine. :)


@mindbreaker

fermjy
10 Feb 2017, 23:35

RE:

mindbreaker said:

And here your first example with cAlgo Api dll (you need include calgo api dll to your ddl as reference)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

// cAlgo.Api References
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.API.Requests;

namespace Boo
{
    public static class Class1
    {       
        public static double Price(Symbol my)
        {
            return my.Ask - my.Bid;
        }

        public static  double PipSize(Symbol my)
        {
            return  my.PipSize;
        }
    }

}

And in cbot:

using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
using Boo;

namespace cAlgo
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class DLL : Robot
    {
        [Parameter(DefaultValue = 0.0)]
        public double Parameter { get; set; }

        protected override void OnStart()
        {
            // Add Symbol
            Print(Boo.Class1.Price(Symbol));
        }
    }
}

And works fine. :)

Thanks mindbreaker, that's what I'm doing for now, but the code is passing something by reference. If It isn't Robot, is Symbol :(
I will figure it out eventually.

Thanks for your time and patience.


@fermjy

mindbreaker
11 Feb 2017, 10:56

        public cAlgo.API.Robot robot { get; set; }

@mindbreaker