Announcement

Collapse

Looking for a User App or Add-On built by the NinjaTrader community?

Visit NinjaTrader EcoSystem and our free User App Share!

Have a question for the NinjaScript developer community? Open a new thread in our NinjaScript File Sharing Discussion Forum!
See more
See less

Partner 728x90

Collapse

A synchronous barsRequest.Request

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

    A synchronous barsRequest.Request

    Hello,

    I am using a BarsRequest to call on specific exchange rates. I have used the BarsREquest within a method so that I can call it whenever I want. I have a problem in that the BarsREquest code provided in the help guide does not perform the BarsREquest in a syncronised fashion and therefore the method returns zero because the method returns before the BarsRequest has had time to complete. I can work around this by using initiating a while loop however this is bad practice and I am aware of all the negative issues sleeping the ui thread brings so I am looking for a way to code the the barsRequest in a synchronous fashion so that the method will not complete until the BarsRequest has completed and in a way that I do not have to rely on the while loop to hold up the thread.

    My code is as follows:

    private double GetGBPUSD()
    {
    double gbpUsdClose=0;
    barsRequest2= new BarsRequest(Instrument.GetInstrument("GBPUSD"), 1);
    barsRequest2.BarsPeriod.BarsPeriodType = BarsPeriodType.Day;
    barsRequest2.BarsPeriod.Value = 1;
    barsRequest2.TradingHours = TradingHours.Get(Bars.Instrument.MasterInstrument. TradingHours.ToString());

    // Request the bars
    barsRequest2.Request(new Action<BarsRequest, ErrorCode, string>((bars, errorCode, errorMessage) =>
    {
    if (errorCode != ErrorCode.NoError)
    {
    // Handle any errors in requesting bars here
    Print(string.Format("Error on requesting bars: {0}, {1}",errorCode, errorMessage));
    return;
    }
    for (int i = 0; i < bars.Bars.Count; i++)
    {
    // Output the bars
    gbpUsdClose=bars.Bars.GetClose(i);
    //Print("GBPInsodemethod "+ gbpUsdClose);
    if(gbpUsdClose!=0) break;
    }
    }));

    while(gbpUsdClose==0)
    {
    Print("Getting the rate...");
    }
    barsRequest2.Dispose();
    return gbpUsdClose;
    }

    Many thanks

    #2
    Hello b16_aln,

    Thank you for your post.

    BarsRequest is an asynchronous method that accesses another thread and the callback is the function it runs when it is finished. The code written after the callback is not going to wait as it is currently written. You would need to move the following code into the callback so that it works asynchronously without relying on the BarsRequest to finish.

    Code:
    while(gbpUsdClose==0)
    {
    Print("Getting the rate...");
    }
    barsRequest2.Dispose();
    return gbpUsdClose;
    }
    If you need to work with series such as plots, drawing objects, or data series, you would use TriggerCustomEvent() before trying to access the series objects.

    Alternatively, you could loop a timer that checks every few hundred milliseconds to see if the callback from the BarsRequest has completed.

    TriggerCustomEvent() - https://ninjatrader.com/support/help...ustomevent.htm

    Please note that blocking/sleeping threads is not advised and will cause undesired behavior.

    Let us know if we may assist further.
    Brandon H.NinjaTrader Customer Service

    Comment


      #3
      Thanks Brandon.

      I'm not exactly sure where to move that part of the code intot he callback to ensure it it correct. Could you please copy and paste the code into the correct palce and post it here?

      Many thanks

      Comment


        #4
        Hello b16_aln,

        Thank you for your note.

        The previously mentioned code could be moved to the end of the callback area as shown below.

        Code:
        // Request the bars
        barsRequest2.Request(new Action<BarsRequest, ErrorCode, string>((bars, errorCode, errorMessage) =>
        {[INDENT]if (errorCode != ErrorCode.NoError)
        {
        // Handle any errors in requesting bars here
        Print(string.Format("Error on requesting bars: {0}, {1}",errorCode, errorMessage));
        return;
        }
        for (int i = 0; i < bars.Bars.Count; i++)
        {
        // Output the bars
        gbpUsdClose=bars.Bars.GetClose(i);
        //Print("GBPInsodemethod "+ gbpUsdClose);
        if(gbpUsdClose!=0) break;[/INDENT][INDENT]while(gbpUsdClose==0)
        {
        Print("Getting the rate...");
        }
        barsRequest2.Dispose();
        return gbpUsdClose;
        }[/INDENT]
          }));
        Let us know if we may further assist.
        Brandon H.NinjaTrader Customer Service

        Comment


          #5
          Excellent, thanks for your assistance.

          Comment

          Latest Posts

          Collapse

          Topics Statistics Last Post
          Started by Max238, Today, 01:28 AM
          5 responses
          42 views
          0 likes
          Last Post Max238
          by Max238
           
          Started by giulyko00, Yesterday, 12:03 PM
          3 responses
          12 views
          0 likes
          Last Post NinjaTrader_BrandonH  
          Started by habeebft, Today, 07:27 AM
          1 response
          14 views
          0 likes
          Last Post NinjaTrader_ChristopherS  
          Started by AveryFlynn, Today, 04:57 AM
          1 response
          12 views
          0 likes
          Last Post NinjaTrader_Erick  
          Started by r68cervera, Today, 05:29 AM
          1 response
          10 views
          0 likes
          Last Post NinjaTrader_ChelseaB  
          Working...
          X