// open // .pairsToOpen // .combineAndVerify( ) // Собирает из двух валют символ и выполняет все проверки, нужные для его открытия. // Возвращает валидность пары для открытия. // Последний аргумент - [...] bool combineAndVerify( string quoted, string base, double& fp1 )
externstring gslM001rus="Все что касается индикации";// externbool gpInfoParameter =false;// выводить параметрыexternbool gpInfoLevel =true;// выводить параметрыexternbool _gDeleteObjectGrafic =0;// 1-Удалять объекты на графике при завершении 0-не удалятьexterndouble FlatSBuy =0.0010;// =0.00050; // пипов на пробой ТОЛЬКО ДЛЯ ИНДИКАТОРА!!!externdouble FlatSSell =0.0010;// =0.00050; // пипов на пробой ТОЛЬКО ДЛЯ ИНДИКАТОРА!!!externint DayHistory =50;// Сколько дней в истории показывать// флет азии externint iTimeEndFlatAsiaHour =5;// Конец утреннего флетаexternint iTimeEndFlatAsiaMin =15;// Конец утреннего флета// Время длины флета измеряется минутами от окончания и назад// 360 минут эт о6 часов назад от 5:15 получаем 23:15 вчерашнего дняexternint iTimeEndFlatAsiaSizeMin =360;// + количество минут флета// externstring sTimeBreakFlatAsia ="20:00:00";// Время до которого разумно ждать пробой и выставление ордеровexternint pУровниHighLowDAY =1;// выводить уровни HIGH LOWexterncolor ЦветПятницыHIGH =DeepSkyBlue;externcolor ЦветПятницыLOW =DeepSkyBlue;externcolor ЦветHIGHDAY =DarkViolet;externcolor ЦветLOWDAY =DarkViolet;externcolor lColorFAH =OrangeRed;externcolor lColorFAL =SandyBrown;externcolor lColorSignalSELL =Red;externcolor lColorSignalBUY =Red;
2)
externstring gslM001rus="Все что касается индикации";// externbool gpInfoParameter =false;// выводить параметрыexternbool gpInfoLevel =true;// выводить параметрыexternbool _gDeleteObjectGrafic =0;// 1-Удалять объекты на графике при завершении 0-не удалять// externdouble FlatSBuy =0.0010;// =0.00050; // пипов на пробой ТОЛЬКО ДЛЯ ИНДИКАТОРА!!!externdouble FlatSSell =0.0010;// =0.00050; // пипов на пробой ТОЛЬКО ДЛЯ ИНДИКАТОРА!!!externint DayHistory =50;// Сколько дней в истории показывать// // флет азии // externint iTimeEndFlatAsiaHour =5;// Конец утреннего флетаexternint iTimeEndFlatAsiaMin =15;// Конец утреннего флета// // Время длины флета измеряется минутами от окончания и назад// 360 минут эт о6 часов назад от 5:15 получаем 23:15 вчерашнего дня//externint iTimeEndFlatAsiaSizeMin =360;// + количество минут флета// // // externstring sTimeBreakFlatAsia ="20:00:00";// Время до которого разумно ждать пробой и выставление ордеров// externint pУровниHighLowDAY =1;// выводить уровни HIGH LOW//externcolor ЦветПятницыHIGH =DeepSkyBlue;externcolor ЦветПятницыLOW =DeepSkyBlue;externcolor ЦветHIGHDAY =DarkViolet;externcolor ЦветLOWDAY =DarkViolet;externcolor lColorFAH =OrangeRed;externcolor lColorFAL =SandyBrown;externcolor lColorSignalSELL =Red;externcolor lColorSignalBUY =Red;////
我更喜欢把功能分成独立的动作,这样代码就有一个清晰的结构......这样更容易优化......。
基本上,它是正常的代码,执行与嵌套if结构相同的计算。但我在某个地方听说,函数中的返回应该是一个。也许,这样做是为了不与他们混在一起。我没有严格遵守这一规则。
在其他方面,我的方法与你的非常接近,C-4,除了几个细节。
是的,有这样一种意见。但返回操作符与GOTO不是一回事。在实践中,我从未遇到过任何意外的返回抛物。相反,当使用这样的运算符和条件时,程序变得更有可读性和质感(所有的检查从顶部向下逐一进行,形成一种列)。此外,与if()操作符不同,return保证了函数的退出,而这正是大多数情况下所需要的,因为如果某些条件没有得到满足,进一步评估数据就没有意义。
用电脑编程时的五个好习惯 ...
我非常喜欢最后一条规则:"永远不要使用'复制和粘贴'操作"。但是,可惜的是,我没有遵循它。怎么可能使用IDE编辑器而不使用节省大量时间的 "Copy&Paste "呢?
事实证明,不是这样的:我注意到,正是因为这样,我经常发现逻辑错误,而这些错误很难被发现。
P.S. 论坛引擎不允许我将我的第一篇帖子中的这个片段格式化
// open
// .pairsToOpen
// .combineAndVerify( )
// Собирает из двух валют символ и выполняет все проверки, нужные для его открытия.
// Возвращает валидность пары для открытия.
// Последний аргумент - [...]
bool combineAndVerify( string quoted, string base, double& fp1 )
正是和我做的方式:前三行看起来不同,更有结构性。好吧,不择手段。
我如何评论的功能
这里还有一些最近想到的规则,我已经在自己的地方实施了。
1.全局变量(GV)不是在代码的开头全部声明,而是根据需要,在使用它们的相应函数之前声明。
2.在每个函数之前,我们还描述了它在实际调用时使用哪些GP(输入)和修改哪些GP(输出)。而在功能之后,你也可以解释哪些GP将不再被使用。
3.所有这些注释,加上函数之间的空分隔线和 "函数长度不超过20行 "的限制,使代码文件的大小增加了1.5-2倍。 这并没有增加编译的难度,而且我们也没有多余的纸张来处理。
4.全科医生的作用是什么?假设我们在函数foo( ..., <type>& variable )中计算某个复杂类型的变量,通过引用传递。那么,如果我们在不同的代码片段中重复使用这个变量,我们将不得不每次都调用foo( ) 函数。这似乎没有问题--除了每次花时间对这个变量进行评估外,我们还在每个使用变量的函数中增加了几行(用于变量声明和函数调用)。为什么?如果这就是所谓的代码重用,它在某种程度上是次优的:除了使foo( )函数的使用过于频繁之外,我们还打破了函数调用的结构,使用户foo( )函数 "脱离了类别",其调用没有层次。将变量声明为 "类别外 "变量,即全局变量,是比较容易的。
就个人而言,我更喜欢严格的分层功能,而不是这种有问题的代码重复使用。我已经说过层次结构:每个第n阶的函数只能被第(n-1)阶的函数调用,而且只能是 "它自己的 "函数。请看我在上面绿色背景的图片中解释功能层次的例子。
5.但当然,代码在层次感上并不总是最佳的,有时你不得不调用 "外来 "的函数。在这种情况下,你可以在 "外来 "函数的名称前用括号/***/写出它在函数层次结构中的位置。
也许这一切都很愚蠢和过分,但我很清楚,我正在写的代码可能要编辑不止一次。在这里,我认为最好在评论和结构上让自己放心。
关于函数的大小。我试图使功能适合于一个屏幕。这样,你就可以看到整个事情。
我试着写代码,以便可以分块修正源代码,并且方便添加和修改。
注释应不低于代码大小的30%。
( 在80年代学会了这样做,看UNIX操作系统的源代码,RT11)
半年后,代码就被遗忘了 - 如果你需要纠正它,评论会让你迅速了解这个问题 !
(我在一个生产现场有一个真实的经历,当我在5年后阅读自己的代码时,我有一个真实的经历)
感谢评论,我在一天之内记住了所有的东西,并在晚上进行了修改)
我试图将代码调整到可读性,而不是在空格和缩进上吝啬。
比较这两个例子!哪个代码读起来更好?
1)
2)
if(param1!=1)return;
if(param2!=2)return;
...
if(param5!=5)return;
Print("Наконец-то дошли!");
基本上,它是正常的代码,执行与嵌套if结构相同的计算。但我在某个地方听说,函数中的返回应该是一个。也许,这样做是为了不与他们混在一起。我没有严格遵守这一规则。
至于其他方面,我的方法与你非常接近,除了几个细节。
我更喜欢用同样的方式独自出门!
更容易控制
如果你想返回一个值,那么
而不是
如果 ( a > c )
返回(3)。
如果 ( l < b )
返回(5)。
...
...
如果 ( h != b )
返回(100)。
---
偏向于
如果 ( a > c )
codret=3。
如果 ( l < b )
codret=5。
...
...
如果 ( h != b )
codret = 100。
// 特别是在返回之前进行了一些所有输出所共有的额外操作的情况下
... 例如,在这里我们做一些其他的事情
retrun( codret)。
}
一点点评论...
为了将文本划分成块,我使用代码为U0151的一行字符。对于那些不知道的人,它是这样打的。
对于 "正确的 "字体,我们得到一个减号,但在两端没有 "空格"。 然后根据需要多次复制它,作为一个良好的视觉边界的实线...
// обычная линия
// -----------------------------------------------------------------------------------
// сплошная линия
// —————————————————————————————————
// —————————————————————————————————
// Вот такие часто делаю ЗАГОЛОВКИ
// —————————————————————————————————
也是评论文本 块的一个巧妙的分块线--它看起来完全对称,但有一个第一开端和一个第二结束的线。
/*///—————————————————————————————————————————
это
多行注释块
...................
/*///-----------------------------------------
尤拉,你的例子有一个回报,当然,这是符合逻辑的。但要注意的是,在这种情况下,所有的if都会被运行,而不像有许多返回的情况下,当函数的退出是在达到条件的字符串后立即得到的。
ForexTools,谢谢你,我已经接受了你的设计理念。