[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 409

 
来自图表的请求类似于CopyRates ArrayCopySeries,而不是RefreshRates。CopyRates 是唯一移动服务器的非交易功能。
 
Zhunko:
当你打开并更新图表时,一个对新数据的请求就会进入服务器。一些贪婪的经纪公司宁愿把钱花在自己的口袋里,而不是花在更强大的服务器和更广泛的渠道上。他们必须限制来自终端的请求数量,以便弱小的服务器不会被 "挂断"。MRC每天只有2000个请求。这比他们的工具数量乘以TF的数量要少10倍,这还不算交易请求。
那么,我们必须避免这样的厨房。这是我第一次听到关于MRC的负面消息。是否只有终端或功能也(除交易外)涉及服务器,还有待观察。我向支持部门提出了这个问题(我在上面写了这个问题,还没有答案)。如果不是唯一的,那么所有的都会落到实处,如果只有终端,那么所有的都会熄灭荒谬的那种类型的终端正在运行,它将联系服务器更新报价,超过限额不交易。我认为这是不充分的,然而,正如维克多所说的,除了交易,其他功能都不访问服务器。

竺可桢

包含在MQL4中有助于精简代码。例如,在我的代码中,3000行的指标是这样的。

问题是,我见过的库,以及文档中提到的,inludes通常被放在代码的最顶端,即声明全局变量 的地方。如果在inludes中存在函数,那么在一个声明全局变量的地方,事实上会有一个函数在那个地方,或者说有某种变量,这似乎很奇怪。代码不是这样写的。如果在专家顾问中使用的变量和外部自定义变量是在顶部声明的,那么就没有人在它们旁边放函数!但他们把嵌体和功能放在一起,而且据我所知,这被认为是正常的。这 就是我在这里最困惑的地方。

这似乎不符合逻辑...

另一方面,如果在某个地方放置一个内联,而不是几个函数,这些函数负责获取,比如说,某个属性的交易信号,这将是一件合乎逻辑和可读的事情。

竺可桢

不幸的是,编译器不允许在一个模块中多次使用一个包容。这通常是一种节省重复性代码的方法。

这是件小事。毕竟,最主要的是把主要的繁琐函数和代码片段放在主代码之外,通过内联来调用它们。然后你可以通过函数名调用你内联的函数......而且你也不必担心这种限制。
 

大家下午好。

学习MarketInfo()和Print()函数

下面是一个使用这些函数的简单代码

测试仪,TF 60分钟。

double T ;
int start()
{
 T = MarketInfo("EURUSD",MODE_HIGH); // в глобальную переменную Т запоминаем максимум дневной свечи,который должна возвращать  MarketInfo ( )
Print (" corresponds to ", T );           //
if ( T > iHigh( Symbol (), 0,10))  // если максимум текущей дневной свечи > High свечи N10(ТФ60 мин)
OrderSend(Symbol(),OP_SELL,0.1,Bid,1,0,0,"jfh",123 ); открыть ордер
}                                                                                                                       
return;

ПРОБЛЕМА 1.Ордер не открывается 2.Print() постоянно возвращает 0 ПРИМЕЧАНИЕ. Для открытия ордера - мне нужной сравнивать параметры свечей разных ТФ(60 мин и 1440 мин.) Подскажите пожалуйста как это можно сделать. Спасибо.

 
Integer:
图表中的请求看起来像CopyRates ArrayCopySeries请求,而不是RefreshRates请求。CopyRates是唯一移动服务器的非交易功能。

检查了RefreshRates()。如果这个专家顾问运行,例如在欧元兑美元上,并且在设置中插入了另一个窗口很久没有打开的工具(这样历史记录就不存在了),历史记录就会出现。

extern string Tool           = "AUDNZD"; // Имя инструмента.
extern bool   IsRefreshRates = true;     // Флаг включения обновления таймсерий.
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
void start()
 {
  string sTool = Tool; // Имя инструмента.
  if (Tool == "") sTool = Symbol();
  while (!IsStopped())
   {
    if (IsRefreshRates) RefreshRates();
    string sComment = StringConcatenate("MarketInfo()\n",
                                        TimeToStr(MarketInfo(sTool, MODE_TIME), TIME_DATE|TIME_MINUTES|TIME_SECONDS), "\n",
                                        DoubleToStr(MarketInfo(sTool, MODE_BID), Digits), "  ", DoubleToStr(MarketInfo(sTool, MODE_ASK), Digits),
                                        "\n\nПредопределенные переменные\n",
                                        TimeToStr(Time[0], TIME_DATE|TIME_MINUTES|TIME_SECONDS), "\n",
                                        DoubleToStr(Bid, Digits), "  ", DoubleToStr(Ask, Digits),
                                        "\n\nМассивы-таймсерии\n");
    for (int i = 0; i < 10; i++)
     {
      sComment = sComment + StringConcatenate(TimeToStr(iTime(sTool, 0, i), TIME_DATE|TIME_MINUTES|TIME_SECONDS), "  ",
                                              DoubleToStr(iOpen(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iLow(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iHigh(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iClose(sTool, 0, i), Digits), "  ",
                                              DoubleToStr(iVolume(sTool, 0, i), 0), "\n");
     }
    Comment(sComment);
    Sleep(300);
   }
 }

所以,仍然是RefreshRates()指的是服务器,并填补了历史记录。因此,控制历史的到来是必要的。

支持部门说,没有一个功能是直接指向服务器的。一切都是通过终端进行的:-)。

 
TarasBY:
如果你使用GetProfitFromDateInCurrency()(原版--这很重要:我不知道你在你的版本中可能得到了什么),那么该函数应该像这样调用。

而该函数将返回自当日开始关闭的订单的利润。

而且你可以用Print()捕捉代码中所有愚蠢的东西。


它不起作用。它显示整个历史上所有可用的交易利润。

这是原始函数,当然,我没有改变其中的任何东西

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит в валюте депозита                  |
//|             закрытых с определённой даты позиций                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента             (""   - любой символ,         |
//|                                               NULL - текущий символ)       |
//|    op - операция                             (-1   - любая позиция)        |
//|    mn - MagicNumber                          (-1   - любой магик)          |
//|    dt - Дата и время в секундах с 1970 года  ( 0   - с начала истории)     |
//+----------------------------------------------------------------------------+
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0)
{
  double p=0;
  int    i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (dt<OrderCloseTime()) {
              p+=OrderProfit()+OrderCommission()+OrderSwap();
            }
          }
        }
      }
    }
  }
  return(p);
}

这里是它的调用和打印

GetProfitFromDateInCurrency (Symbol(), -1, -1, iTime (NULL, PERIOD_D1, 0));  
Print(   GetProfitFromDateInCurrency () );
 
Zhunko:

检查了RefreshRates()。如果这个专家顾问运行,例如在欧元兑美元上,并且在设置中插入了另一个窗口很久没有打开的工具(这样历史记录就不存在了),历史记录就会出现。

所以,仍然是RefreshRates()指的是服务器,并填补了历史记录。因此,控制历史的到来是必要的。

支持部门说,没有一个功能是直接指向服务器的。因此,一切都通过终端完成 :-)


瓦迪姆,我在一个终端上运行了你的脚本,在这个终端上,除了主力和与日元的交叉盘,我从来没有开过任何工具。总之,这里有一张截图。

从评论来看,没有任何东西被抽走,因为市场数据阵列是空的......。

 
hoz:


瓦迪姆,我在一个终端上运行了你的脚本,在这个终端上,除了主力和与日元的交叉盘,我从来没有开过任何工具。总之,这里有一张截图。

从评论来看,没有任何东西被抽走,因为市场数据阵列是空的,...


是的,他也没有注意到,他的专家顾问中有MarketInfo(),而不仅仅是RefreshRates()。
 
Zhunko:

检查了RefreshRates()。如果这个专家顾问运行,例如在欧元兑美元上,并且在设置中插入了另一个窗口很久没有打开的工具(这样历史记录就不存在了),历史记录就会出现。

所以,仍然是RefreshRates()指的是服务器,并填补了历史记录。因此,控制历史的到来是必要的。

支持部门说,没有一个功能是直接指向服务器的。因此,一切都通过终端完成 :-)


想象力的水平令人印象深刻。为什么数据只出现在某些符号上(没有打开),而不是在市场审查中的所有符号上?RefreshRates()函数是如何知道有些符号应该被更新,有些不应该被更新?

顺子,别胡思乱想了。

 
lottamer:


不起作用。输出整个历史中所有可用的交易利润。

这里是原始函数,当然我没有改变其中的任何东西

这里是它的调用和打印

GetProfitFromDateInCurrency (Symbol(), -1, -1, iTime (NULL, PERIOD_D1, 0));  
Print(   GetProfitFromDateInCurrency () );

所以一切都很正确。你逐行 "阅读 "函数,了解它是如何工作的,如果你太无聊了,无法自己写,一切都会水到渠成......

你有一个函数参数。

iTime (NULL, PERIOD_D1, 0)

是最后一天的开仓时间,也就是说,所有在当日开仓前平仓的头寸都会被计算出来,并进行加总!这有意义吗?所以要设定另一个标准,这是必须的,或者说是什么。但这要看你怎么看。

 
Integer:

是的,他也没有注意到,他的专家顾问中有MarketInfo(),而不仅仅是RefreshRates()。


也是所有的功能。


DoubleToStr(iOpen(sTool, 0, i), Digits), ", DoubleToStr(iLow(sTool, 0, i), Digits), ", DoubleToStr(iHigh(sTool,0, i), Digits), " ", DoubleToStr


(iClose(sTool, 0, i), Digits), " , DoubleToStr(iVolume(sTool, 0, i), 0), "\n")。

自然,数据会被更新。