谁想要一个战略?很多,而且是免费的) - 页 57

 
Miroslav_Popov >> :

而且你还可以把缩减量添加为百分比,这样更容易看出来。>> 谢谢你。

 

这可能是FSB到MQL4转换器的开始。

非常感谢任何帮助或反馈。


//+------------------------------------------------------------------+
//|                   FSB__Bar_Opening - Bar_Closing.mq4 v0.0.1 Beta |
//|                                 Copyright © 2009, Miroslav Popov |
//|                                              http://forexsb.com/ |
//|                                                                  |
//| An exmple EA pattern:                                            |
//| * Enter the market at Bar Opening                                |
//| * Exit the market at Bar Closing                                 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Miroslav Popov"
#property link      "http://forexsb.com/"

// The time span before bar closing time in seconds.
// It determines the time interval for position closing.
extern double ClosingTimeSpan = 10;


int start()
{
   // Check if there are open positions from the previous bar
   int iOrders = OrdersTotal();
   if( iOrders > 0)
      ClosePositionsAtBarClosing(true, true, ClosingTimeSpan);
 
 
   
   // Opening Logic Conditions
   bool bLongEntryAllowed  = false;
   bool bShortEntryAllowed = false;

   // Put the entry logic rules here ...
   
   if(iMA(NULL, 0, 13, 0, MODE_SMA, PRICE_CLOSE, 1) >
      iMA(NULL, 0, 13, 0, MODE_SMA, PRICE_CLOSE, 2))
      bLongEntryAllowed = true;
   else
      bShortEntryAllowed = true;


   // Entry at Bar Opening
   iOrders = OrdersTotal();
   if( iOrders == 0)
   {
      if( bLongEntryAllowed || bShortEntryAllowed)
         OpenPositionAtBarOpening( bLongEntryAllowed, bShortEntryAllowed);
         
      iOrders = OrdersTotal();
      if( iOrders > 0)
         return(0);
   }



   // Exit Logic Conditions
   bool bCloseLong  = true;
   bool bCloseShort = true;

   // Put the exit logic rules here ...
   
   // Exit
   if( bCloseLong || bCloseShort)
      ClosePositionsAtBarClosing( bCloseLong, bCloseShort, ClosingTimeSpan);
}

// Entry at a Bar Opening price.
//
// MetaTrader does not provide an onBarOpen event so we check the current tick volume.
// We open a position when the current tick volume is equal to 1.
void OpenPositionAtBarOpening(bool bLongEntryAllowed, bool bShortEntryAllowed)
{
   if(! bLongEntryAllowed && ! bShortEntryAllowed)
   { // An entry is not allowed.
      return(0);
   } 
   
   // Check for Bar Opening
   if(iVolume(NULL, 0, 0) > 1)
   {  // This is not the first tick.
      return(0);
   } 
   
   int iLots = 1;

   // Check the free margin.
   if(AccountFreeMargin() < (1000 * iLots))
   {
      Print("We do not have money enough! Free Margin = ", AccountFreeMargin());
      return(0);  
   }
      
   int ticket = 0;
   if( bLongEntryAllowed)
   {
      ticket = OrderSend(Symbol(), OP_BUY, iLots, Ask, 3, 0, 0, "Bar Opening", 0 ,0 , Green);
   }
   if( bShortEntryAllowed)
   {
      ticket = OrderSend(Symbol(), OP_SELL, iLots, Bid, 3, 0, 0, "Bar Opening", 0 ,0 , Red);
   }
   
   if( ticket > 0)
   {
      if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
         Print("Position opened at: ", OrderOpenPrice());
   }
   else 
   {
      Print("Error opening a position: ", GetLastError());
   }
      
   return(0);
}


// Exit at a Bar Closing price (almost).
//
// MetaTrader does not provide an onBarClose event so we are not able to close a position
// exactly at Bar Closing. We workaround the problem by closing the position within a time span
// near to the bar closing time. In the cases when there is no any ticks within this period,
// we close the position att he next bar opening price.
void ClosePositionsAtBarClosing(bool bCloseLong, bool bCloseShort, datetime dtClosingTimeSpan)
{
   int  iOrders = OrdersTotal();
   bool bIsOpen = false;

   for(int iOrder = 0; iOrder < iOrders; iOrder++)
   {
      OrderSelect( iOrder, SELECT_BY_POS, MODE_TRADES);
      
      if((OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderSymbol() == Symbol())
      {  // There is an open position for this symbol.

         datetime dtOpeningTime     = iTime(NULL, 0, 0) - TimeSeconds(iTime(NULL, 0, 0)); // The opening time of current bar
         datetime dtClosingTime     = dtOpeningTime + Period() * 60;                      // The closing time of current bars
         datetime dtCurrentTickTime = TimeCurrent() ;                                     // The time of current tick
         
         if(
            dtCurrentTickTime > dtClosingTime - dtClosingTimeSpan || // The current tick is within the closing time span.
            iVolume(NULL, 0, 0) == 1                                 // or this is the first tick of next bar
            )
         {
            if(OrderType() == OP_BUY && bCloseLong)
            {  // Close a long position
               bIsOpen = OrderClose(OrderTicket(), OrderLots(), Bid, 3, Violet);
               
               if( bIsOpen)
                  Print("Long position closed at: ", OrderClosePrice());
               else
                  Print("Error closing a position: ", GetLastError());
            }
            else if(OrderType() == OP_SELL && bCloseShort)
            {  // Close a short position
               bIsOpen = OrderClose(OrderTicket(), OrderLots(), Ask, 3, Violet);
               
               if( bIsOpen)
                  Print("Short position closed at: ", OrderClosePrice());
               else
                  Print("Error closing a position: ", GetLastError());
            }
         }
      }
   }
   
   return(0);
}
附加的文件:
 

如果FSB能够生成一个带有策略的dll,并且功能能够像这样,那就更好了。

#define inp   100
//---

#import "FSB.dll"
int    bEntryAllowed(double close[ inp], double open[ inp], double high[ inp], double low[ inp], volume[ inp]);
#import


也就是向dll发送一些条形图,并从策略中获得响应。


dll本身是这样的

#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
//----
#define MT4_EXPFUNC __declspec(dllexport)
#define inp 100
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
  {
//----
   switch( ul_reason_for_call)
     {
      case DLL_PROCESS_ATTACH:
      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
      case DLL_PROCESS_DETACH:
         break;
     }
//----
   return(TRUE);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC double __stdcall int    bEntryAllowed(double close[ inp], double open[ inp], double high[ inp], double low[ inp], volume[ inp])

  {
   int out;

   //--- strategy

   if ( close[1]> close[0]) out = 1;
   if ( close[1]< close[0]) out = -1;

   return( out);
  }
反正你有自己的所有指标,只需要时间序列 数据即可
 

我以后会提供完整的FSB <-> MT4桥接。

因此,FSB将从MT获取报价和账户信息,并将交易指令发送回来。这样一来,它就能在MT中交易FSB策略。


现在我正试图制作一些基本的EA框架,以适应MT中的FSB策略,而不需要任何互操作。


我需要几个简单的图案,比如。


* 在Bar Opening(或指标值)时输入(增加、减少、关闭)。

- condition1 == true;和

- condition2 == true;和

- condition3 == true;和

- condition4 == true

*在酒吧关闭时退出。

- condition1 == true;或

- condition2 == true。

* 以指标值退出。

* 在永久止损处退出

* 遵循参赛规则进行逆转。


大多数指标都是标准的,其他的则相当简单,可以很容易地在MQL4中重写。一旦我们有了基本的EA模式,翻译指标就没有问题了。


我现在正在测试的东西是。

在 "开盘 "时开仓,在 "收盘 "时平仓。


因此,我希望能开发两种新产品。

1.FSB - MT数据输入和执行桥梁

2.策略导出器到MQL4


可能这两个程序都将是开源的。

 

(哦,我以为现在这个话题很平静......让我们来活跃一下吧:)?(我将写很多......我将努力做到合乎逻辑;),并且不使主题过重--我将把它分成几个信息)


先生们,欢迎!


米罗斯拉夫--首先,"关于天气 "的几句话(抒情部分)......(我真诚地希望你对俄语的理解能达到标准:))。


当然,产品是很好的。我从我的经验出发,既作为一个前程序员,也作为一个抽象的用户(抽象的软件)。你可以感受到对它的热爱(因为一切都做得非常仔细),而且有希望,程序的发展不会 "突然 "停止(不会死亡)。是的,很可能有一些逻辑上的错误(一个说明性的例子是关于数据地平线),界面上有一些小的错误......。但总的来说--这就是这首歌!这只是一首歌而已!!!。


我请公众注意另一个揭示的事实。对批评的态度和对问题/缺陷/新功能/等的讨论风格。这是我在这个主题的开始,替代产品的发展开始的背景下,以及SSB的作者如何对对他的地址的评论做出反应。我不认为Miroslav也有 "马车 "时间来开发一个免费程序(而且他就是这样一个程序员)。但他为我们找到了时间(沟通),根据我们的意见和要求最终确定产品,修复错误并提供新的东西(见他最近的帖子)。而且一切都很平静,有分寸,没有歇斯底里,就像前面提到的SSB案件。这值得(额外)尊重。我的问候,米罗斯拉夫...


完成抒情的部分(现在心不在焉地)--我个人是 "随机价格运动 "理论的支持者。在这个问题上,我完全同意某些人的意见(包括像http://www.bigmany.ru 网站的创建者),他们相信在市场上工作(我指的是外汇和 "接近它的一切"),没有办法识别(唯一)两个主要市场指标(我指的是成交量)中的第二个。- 依靠技术分析和在较小程度上的基本面分析的任何信息,根本没有用处和意义(没有任何合理的意义)。


我们可以在这里完成一般:),但如你所知 - 俄罗斯是臭名昭著的傻瓜和道路,并使用此声明的第一点 - 我仍然不离开的想法 "赚取数百万":D,事实上 - 我只是好奇。听 "分析家的意见 "很有趣(就像占星家的星座--"许多专家",没有什么用处),光看图表也很有趣(你同意--这很了不起),乱用代码也很有趣(你开始真正理解人们试图用给定指标表达什么), ...这只是有趣的...有一天,欺骗(或者更好的是--不欺骗)"系统 "是很有趣的......这就是我在这里(在市场上,有条件地)的原因。 而且我希望不仅自己能受益,也能让公众受益。因为像米罗斯拉夫--生活中的一些利他主义者。


我目前的观点是,目前全世界正在使用的技术分析系统(而且是明显的大多数)确实是,参与了市场。也就是说,一群人看着他们的显示器,在他们的指标值的指导下,友好地期望向某个方向移动,进行交易......并移动这个价格。即使是小规模的,即使不总是这样(仍有一些 "工厂、报纸、汽船 "的所有者根本不在乎TA,他们只需要在某个时间买入或卖出一定的数量)。但它发生了!换句话说--作为 "圈内人"(同一个TA),你可以尝试将你在市场上的积极随机运动的概率转向(略微?)超过50%。这并不容易...但有可能!只要我对这个假设感到失望--我就会离开市场......(而且不会是关于利润/亏损的大小,只是,在一个完全随机的系统内工作真的很令人沮丧和毫无意义......)嗯,见上文)

 

因此,现在开始谈正事。

1.虽然这里一直很冷清--我一直在思考。是的,我们可以等待Miroslav(当他做出MT和FSB之间的桥梁时,或者在这里,策略编译器)。但是,最终--至少是自己做了什么的人得到了结果:)。我从假设开始,我有(保证)一个给定的工具(FSB),我有MT,让我们假设,除了这两个实体,不会有其他东西--因此我们在他们的框架内运作,即。FSB(目前)是一个封闭的系统;无论如何我们将需要MT;顾问(交易机器人)的代码在任何情况下都需要 - 是的,应该有一个通用的模板,(大致)给出指标和所有的值,然后根据 "批准的计划";所以我们将需要指标本身。


2.我将在专家顾问代码处立即停止。我不同意简单的专家顾问创造者的乐观态度--好吧,不可能想象终端和市场中异常情况的数量。而且我们谈论的是钱,不适合开玩笑(他们没有检查错误代码--他们计算了一些默认动作......就这样,-1000美元就没了(有条件的))。也就是说,我深信,任何真正与金钱(或者,最好是真正的金钱)打交道的专家,在对外部事件的反应方面必须是 "铁板一块"。代码必须为终端、服务器或市场本身提供最大数量的变化。简而言之--这是相当严重的问题,不能用跳跃的方式解决(写)。我很乐意参与这种模式的创造。但是...


3.我决定从底部一路走下去。我有一个想法--如果专家顾问(指标)没有什么可操作的,那我们还需要专家顾问做什么呢:)!所以我拿了指标。

前提是这样的。首先,没有人会保证FSB中的指标值等同于MT中的标准或额外指标值。而为了在两个项目中获得 "可比 "的结果--数值应该是相同的。第二,指标本身的数量(标准)始终是不同的。而要使用(和搜索)外部的...不知何故,我喜欢标准或我自己的(生活)...(第三--我有一个印象,从FSB "转换 "指标代码并不是一个巨大的任务,正如Miroslav提到的--算法本身很简单,指标本身在代码方面非常 "有组织"(代码是统一的),也就是说,大致上--它们创造了一组错误。粗略地说,我们创建一次模板,然后用一些指数逐一 "填充 "它(这是世界的理想形象:))。第四部中还有更多--我在想:)。

总之,这就是周末的全部内容。在我开始做一件事之前,我通常会 "花很长的时间来驾驭"(在这种情况下--思考)。我没有时间去修改模板本身(我理解)。特别是当指标的数量超过一定的数字时。因此,应一次性设计好关键点。因此,我做了以下假设。


- 这些应该是指标(而不仅仅是专家顾问的未来代码的功能)。毕竟,对信息的视觉感知对人(特别是对我)来说起的作用不小,从专家顾问代码中调用一个指标并不是什么大问题(iCustom 已经在论坛上引起了很多麻烦--当有这么多意见时,我通常更喜欢自己检查一切,我 "实地测试 "的结果就可以了,可能有一点开销,但 ,不是一个大问题 (这一点我完全负责地声明),我认为在普遍性方面可以忽略不计)。但对于 "特殊的鉴赏家 "来说 :)(以防万一),以防指标中的计算是在同一类型的单独函数中进行的(见下文)。


- 指标必须输出与原FSB中相同的数值(下面单独协商的项目)。即以FSB的代码为基础,如果可能的话,尽可能少地修改。


- 该代码应进行优化,以便与IndicatorCounted一起正确工作(即通过速度)。


- 指标参数以及它们的值必须是统一的和同质的。我不是在谈论数据类型,就其本身而言。如果我们看一下Miroslav的指标代码,我们会看到输入参数和输出缓冲区的良好同质性。任务是保持最初的图片,以帮助用户在指示参数或取指标值时容易得到指导。

- 上一点的含义是......。毫米(注意-- 这很重要使用所有指标的关键点不在于它们本身产生任何价值。就是它们产生了 信号!真的,对我这个人来说--现在或以后的指数价值有什么区别呢(?),它仍然是 "难以理解的数字"。可以理解的是当它不是 "买 "就是 "卖 "的时候:)。其他的都是 "不清楚"!Miroslav通过在每个指标(多头和空头)中创建两个缓冲区,根据指标的使用方式(作为头寸或逻辑条件的一个点),获得开仓/平仓或 "是/否 "过滤器的值(如果在开仓逻辑中全部为 "是"--开仓,如果在平仓逻辑中至少有一个 "否"--平仓(一般来说,RTFM),非常优雅地使用这个想法。天才!;) 我按照这种方式,模拟了这种行为。目前,该指标的前两个缓冲区(其数值可以在数据窗口中看到)是相应的缓冲区,有过滤器(1/0)或价格值,分别用于向多头或空头开仓。 即后来,当使用专家顾问代码中的指标时,它并不真正关心一个特定的指标产生什么,在哪里或什么值 - 它将只是分析前两个缓冲区的值,以获得一个非常简单的主题(是/否(有条件地)或直接接管价格从那里)...就这样吧!有一个细微的差别--几乎100%的 "将绊倒 "在Ishimoku上(在那里,指标自身缓冲区的数量接近MT本身的极限(8))。- 我不想拒绝一个好主意(与前两个缓冲区),但我不能把它们合二为一(我在想......)。不仅可以有1/0(可以变成一个比特掩码),还可以有价格标签)。最有可能的是,我将不得不对指标值本身做一些处理......我们会看到...当我们去...

 

一般来说,简而言之(摘要):质量(FSB 兼容性、无错误等)、易于进一步使用、速度、代码可读性。按照这个顺序。

好吧,并且(实际上)-发生了什么...(简史)

- 所有指标在文件名前缀中都有值“fsb”(例如:“fsbBlaBlaBla.mq4”)。


- 我以伪随机顺序排列指标本身,所以不要怪我。到目前为止,有,就是这样。用于进一步讨论/分析等。 - 我认为这就够了。


- Miroslav 使用三个外部函数(放置在源代码中(位于页面的最底部))来计算移动平均线和逻辑缓冲区的值。我不得不从他们开始。所有函数都封装在一个文件(“ fsbCommon.mq4 ”)中,排列为库函数(“ fsbCommon.mqh ”)。该歌剧还有另一个文件(“ fsbConstants.mq4 ”),为了方便代码,它分别包含常量。函数本身没有特别的问题(我有点复杂的“逻辑振荡器”的初始逻辑,额外的检查(越界数组,保证正确的初始值(历史上的第一个)(米罗斯拉夫,有一个关于此主题的代码中的逻辑错误).. . 并且尝试了很长时间来“模拟”iShift 在 MovingAverage 中的行为,以便该函数正确地填充结果缓冲区的值对于该参数的任何合理值(不仅限于原始原始代码中给出的那些限制)......因此,我现在放弃了这个问题,在开头放了一个“存根”(iShift不是“0”,函数没有工作还没有,但是,还不需要))。 MovingAverage 原来很麻烦,但它用一块石头杀死了几只鸟。由于从函数中返回缓冲区作为 MT 中的值,这是不可能的(也许不是必要的) - 最后出现了一个附加参数( afTarget )另外,考虑到IndicatorCounted (),再走一步该参数负责对第一个柱的值进行处理。好吧,最后一个附加参数根据 MT 设置“价格常数”,根据该值,根据现有的系列数组计算 MovingAverage 本身的值,或者(如果值 应用价格 在“价格常数”MT的值之外)-基于 来源. (因此代码的重载)我将立即指定编程的细微差别 - 其中有循环穿插按大小写的选择 - 循环插入到选择中,而不是(通常更合乎逻辑)反之亦然。这样做不是因为我不知道如何正确地做——而是因为我知道有多快:)! (好吧,在未来,我不会详述这个,谁想分析代码 - 不客气,但在问“关于代码的愚蠢性”的问题之前,想一想什么(可能)会导致这样编程)。


另一个细微差别与 MovingAverage 相关(它可能对某人有用) - 因为。指数平滑模式(包括平滑)中的移动平均值直接取决于它们自己之前的值——“起点”的选择变得非常重要(取什么值作为进一步计算的基础)。通常有几种方法可以解决这个问题。有人拿上一期的收盘价。有人对上一期 N 的价格进行了平均... Miroslav 采取了第二种方式。 MT 显然是第一位的。因此,在图表开头这两种平滑模式存在显着差异(我添加了一个空白来测试 MovingAverage 和其他所有内容(“ fsbTest.mq4 ”))!以及我在函数内部对 MovingAverage 本身的数据可用性施加的限制 iFirstBar,或类似数量的计算值 iFirst 酒吧。因为指标本身使用一个常数作为图表上的最小值(现在是 2000)——这对于任何情况都应该足够了(因为我还没有看到周期大于 200 的参数)。当然,除非一次使用不止一个 MA ;)。


- 与上一段类比,为我在此项目的工作中已经使用的外部子功能创建了文件(前缀“st”:“ stCommon.mq4 ”、“ stCommon.mqh ”、“ stConstants.mq4 ”)


- 嗯,实际上 - 指标本身。简而言之(让我们以“ Bar Range ”为例):

 //extern int slotType = SLOT_TYPE_LC;
外部的 int indLogic = INDICATOR_RISES ;    // (INDICATOR_RISES <= indLogic <= INDICATOR_LOWER_LL)
外部的 诠释nBars = 1 ;                  // 1 <= nBars <= 200
外部的 诠释fLevel = 0 ;                  // 0 <= fLevel <= 500
外部的 bool iPrvs = True ;                // 真假

插槽类型 类型 插槽 FSB(位置点逻辑条件)术语这些指标不仅可以作为进入/退出过滤器,还可以设置开盘/收盘价 - 此参数准确确定指标将在其逻辑缓冲区中生成什么。查看 fsbConstants.mq4 中的所有常量(那里的一切都很清楚)

工业逻辑 - 事实上,指标的逻辑条件(承载不同的语义负载,取决于值 插槽类型

好吧,参数更进一步,按照它们出现在 forexsb.com 指标源中的顺序,以及它们在 FSB 本身中的显示方式。参数边界在注释中指定,并在调用 init() 时通过调用 PCheck() 子函数来控制。

LPIndBuffer [];            // 多头头寸 #1
SPIndBuffer [];            // 空头头寸 #2

双倍缓冲[ ];              // 指标的值#3

doubleIndBufferDD [ ];            // 绘图 #4 的附加缓冲区
双IndBufferDU [ ];            // 绘图 #5 的附加缓冲区

使用缓冲区,全局级别的所有内容都用作指标缓冲区(附加到指标本身)。只是所需的逻辑值 (LPIndBuffer[], SPIndBuffer[]) (总是并且总是按照这个顺序 (#0 - 多头头寸, #1 - 空头头寸)), IndBuffer[] - 指标本身的数据。但是在这种情况下,由于使用了颜色直方图,所以这个缓冲区只携带自己的值,另外还有两个缓冲区用于颜色渲染(说实话,MT只是通过传输指标开始编程的:),你怎么能否则在 MT 中模拟颜色直方图的行为 - 我从来没有想出过它(谁能说出来?如果这可能的话))。它们不会以任何方式显示在 DataWindow 中。

在里面() 一切如常(检查参数值,设置指标本身和索引的名称,附加缓冲区等)


在 deinit() 中,我正在考虑在没有关闭指标的情况下插入逻辑(额外的便利,以便那里的参数不会重置等),在我闲暇时(还不是优先事项)。


开始() 非常原始。它的任务是检查图表上是否有足够的柱线(计算任何 MA 和一般情况下)并调用计算指标本身的函数,成功调用后,调用指标的自定义绘制(如果需要以某种特殊的方式绘制,如在本例中为 -once)


计算() - 实际计算。总的来说,该代码类似于 Miroslav 的代码,但与 IndicatorCounted() 相关的优化存在异常。如果需要额外的指标缓冲区来计算指标,它们被设置在函数本身内部(静态)(以免浪费指标本身的索引),并由 BufferSync() 函数提供服务。这是一个单独的笑话 - 最初试图通过一个更恒定的参数 (iMaxBars) 来限制计算。 “现场测试”(第 2 部分)系列数组在存在历史、缺席、移动到未来的情况下的行为(报价的到来,向右增加数组(我现在在视觉上,关于图形表示)), ...移动到过去(当历史丢失时(我们移动到图表的左侧)并且终端从服务器加载它......并且数组扩展到左边)......所以。 .. 断了。我做得很漂亮(试图做到) - 取决于扩展 BufferSync () 的方向并扩展数组。 left 或 right,填写空的 EMPTY_VALUE 值。这里只有它自己 MT 通常不会将索引数组扩展到 LEFT。他总是将它们向右扩展(从 [0] 条的一侧)。我希望很清楚我在说什么 - 在历史上的下一次跳转中,当图表上的柱的值超过 iMaxBars 时(再次通过跳转) - 当指标不会绘制其值时,很有可能出现这种情况iMaxBars的左侧,但这里是“奇怪的数据”来自它,iMaxBars的左侧可以很容易。也许没有人会看它们……但是“不漂亮”(不是我们的方法)。而所有需要的是 MT 本身在正确的方向用空值补充缓冲区......有可能捕捉到这种情况,但是......一般来说,我们从一开始就绘制图表..._总是_。 (好吧,就这个特定指标而言)


另一个细微差别与 IndicatorCounted() 相关 - 看起来 - 一个神圣的功能。返回计算柱的值,不会有针对您的索赔......将!我认为应该责备的不是 IndicatorCounted() 本身(以及来自 MQ 的程序员),而是一群自定义指标程序员,他们没有达到这个函数的神圣目的。因此,它被迫总是返回少量的潜在值。我们要么重新计算整个图表 (IndicatorCounted() == 0),要么重新计算第一个 ((IndicatorCounted() == Bars - 1) 或两个 (IndicatorCounted() == Bars - 2) 条。我的意思是,例如,如果连接断开并且图表“运行”了不止一个条形 - 仅此而已......“树木站立死亡”(IndicatorCounted() == 0) - 我们将整个图表计算在一个新的为什么?不可能返回跳过的条数(3、4、... 5... 10...)?(据我了解,这就是这个函数最初的用途)一般来说,就像这样。 ..

...我“偶然发现”了 RSI。并且在任何意义上。首先,我不明白 Miroslav 的代码(对他的问题将在下面)。其次,在测试指标时,我看到在 MT 和 FSB 内获得的值存在差异!不,这根本不是你想的那样(“弯曲地忍受”——好吧,承认吧,你想;))。不幸的是,重点似乎在这些声明中:

浮动[] afPos = 新的 浮动[];
...
浮点数 _
...

简单来说—— 漂浮!想了想,我暂时放慢了速度。第一个论点(准确性和质量)变得有问题(这是一个优先事项)。


这里可能有以下推理:一方面,浮动还不错,它可以说是指标值的“粗化”,这应该使交易策略更不容易受到市场随机峰值的影响。另一方面,例如,当跨越一些 fLevel(例如 1.0)时 - 你会同意:0.99998 和 1.00001 是两个很大的区别:)。并且存在这样的差异。而如果pose在某某时刻打开,但实际上FSB等级还没有达到1.0就下降了,那该怪谁呢? (转移指标的人:D?!)


实际上有两种解决方案(假设不支持浮动 MT!):


- 模拟 MT 本身的浮点数(带有一些令人心碎的结构,如 NormalizeDouble(X, Digits + 2) ) - 不是到处都是,但考虑到每个乘法/除以任何


- 将 FSB 中的浮点数更改为双倍。在这里你需要了解变化的范围,显然是有限的,但你需要小心地到处走。并且人类产生的策略的潜在结果可以“浮动”。总的来说,米罗斯拉夫是否需要它? (我的拙见是FSB本身需要这个,因为额外的精度从来没有伤害过任何人,但是在这个时间段的计算速度(如果追求这个目标(?),因为我看不到更多的原因)现实 - 这不应该有任何重大影响)。我同意 MQ 的人在这个问题上的看法——因为。如果我们不使用整数数学(一些小数),那么至少我们会尝试以最大可能的精度。总的来说,这是一个......不是一个简单的问题......

 

对不起,我说得太啰嗦了(我不说了,只说本质)。


我想听听大家的意见--这个话题是否应该继续下去(再 "走 "下去,剩下的指标要挖出来)?我甚至可以按照一定的顺序(因为所有相同的原始混乱:)),谁,也许,什么需要前进。不幸的是,在一般情况下,时间是被剥夺的(副总经理在他的办公室里--"日子在不知不觉中飞逝":D)。我通常在晚上找到时间。 但每天有一两个指标,我想我可以提供...



那么,就这个问题向米罗斯拉夫提问......

1.fMicron 的值是多少? (我把它(经思考)设置为0.000001,似乎,或者它更小?


2.参数bIsDescreteValues 是什么 (在震荡器逻辑中)。我明白它的意思 - 但它的默认值是什么?而这种变化取决于什么条件?(或者我们应该说--它与什么有关(在FSB界面或其他地方))。


3.其实关于RSI,这个设计是什么?

for (int iBar = iFirstBar; iBar < Bars; iBar++)
{
afPosMA[iBar] = (afPosMA[iBar - 1] * (iPeriod - 1) + afPos[iBar]) / iPeriod;
afNegMA
[iBar] = (afNegMA[iBar - 1] * (iPeriod - 1) + afNeg[iBar] ) / iPeriod
}

:)?提出这个问题的动机如下。如果我的看法是正确的--它是一个平滑的MA。在整个代码的背景下--它被应用于已经计算好的MA并生成平滑的MA,其中只有第一个值保持 "活力":)。有点像一个逻辑问题--这里有什么是多余的?这种结构,除其他外,使 REALIZED(!)选择指标本身的RSI平滑模式(它总是变成平滑的),以及在其附属的模式。或者以前的MA计算(从参数上看有正确的模式)的afPos,afNeg?


显然,经典的RSI是基于平滑的平均值。但是,至少有一个带有Simple MA的变体,删除上述代码使maMethod参数行为具有可操作性是很合理的。或者我们在这个周期之前删除MA计算,并在所有指标中删除MA RSI参数(因为它们反正不影响任何东西!)。


我将删除这段代码(上文):)。(在转换后的指标中,这部分是有评论的,谁需要原来的功能--删除评论标签!RSI代码仅用于参考...在我们做出决定之前,我将 "自担风险 "地使用它 :))


4.正如已经说过的,在初始条形图的行为中,振荡器的逻辑存在一个非关键性的逻辑错误。我现在做不出来,明天我会把它写下来(在哪里和如何纠正)。


5.我们应该如何处理 FSB 中的 浮动?(或在 MT中缺乏它 ):)?


该档案包含所需的文件,已解压至MT根目录(该档案将在下一篇文章中)。


祝大家好运...写:)
 

当前指标档案 (2009-04-15)

附加的文件:
experts.rar  101 kb
 

我同意漂浮不起作用--我们需要寻找一条出路。我们需要写书信。然后创建一个指标库。如果我能提供帮助,我将很高兴。