任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 125 1...118119120121122123124125126127128129130131132...1178 新评论 Artyom Trishkin 2013.09.07 02:32 #1241 Sepulca: 我本来是这样做的。 P.S. 同时回答)))) 我不明白。 if(shift>0) shift=shift-1; 如果在第一条街打开,从零到零看? Mikhail Kozhemyako 2013.09.07 02:42 #1242 artmedia70:我不明白。如果在第一根柱子上打开,我们是否从零开始寻找? 这是一个小小的保证,以防订单的开盘价 已经比开盘时的低价高很多。也就是说,我们不使用开放栏进行搜索。这就是PERIOD_M1的作用。 Artyom Trishkin 2013.09.07 02:55 #1243 Sepulca: 这是一个小的对冲,以防订单的开盘价已经明显高于开盘时的低价。也就是说,我们不使用开放栏进行搜索。这就是PERIOD_M1的作用。 我将以不同的方式来做。一般来说,我只有在该位置持续了一个以上的柱子时才会开始搜索。毕竟,最好的价格可能就在开盘价上,而我们会浪费它。 Mikhail Kozhemyako 2013.09.07 04:03 #1244 artmedia70: 我将以不同的方式来做。一般来说,我只会在该位置持续了一个以上的小节时开始搜索。毕竟,最好的价格可能就在开盘价上,我们会浪费的...... 我同意。记忆数组中每个未平仓订单在每个tick 上的最低(或最高)价格,并在达到条件时关闭订单,可能会比从订单开启的那一刻起重新搜索最低价格更有效率。 ShortOrderTicket[i]=OrderSend(Symbol(),OP_SELL,...... if(ShortOrderTicket[i]>=0) min[i]=Bid; //..................................................... //На каждом тике обновляем минимумы для каждого открытого ордера for(i=0;i<N;i++){ if(ShortOrderTicket[i]>=0){ min[i]=MathMin(min[i],Ask); } // Если достигнуто условие, закрываем ордер if(Ask>min[i]+Delta) if(OrderClose(ShortOrderTicket[i],.....))ShortOrderTicket[i]=-1; } 在出现问题的情况下,如失去连接,重新启动顾问等,我将不时地修改订单的止损。 Viktar Dzemikhau 2013.09.07 04:58 #1245 artmedia70: 我认为这里的数组必须通过引用来传递。否则,该函数将不得不只与一个严格定义的数组工作。即使你在全球范围内定义了它。 嗯。这取决于哪个数组被传递给了调用函数。如果它是一个特定的数组,那么被调用的函数将与它一起工作...因为那是... 比如说,如果 void FindOrders(int massive[]) { int oType; ArrayInitialize(massive, 0); for (int i=OrdersTotal() - 1; i>=0; i--) { if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; if (OrderSymbol() != Symbol()) continue; if (OrderMagicNumber() != i_magic) continue; oType = OrderType(); massive[oType] = massive[oType] + 1; } } 通过这样的称呼。 FindOrders(OrdersMassive) 它与OrdersMassive 阵列一起工作。 就这样。 FindOrders(massiveOfOrders) 有了massiveOfOrders 数组。 forexman77 2013.09.07 04:59 #1246 你能告诉我如何在开仓交易时找出点差,或者更好的是,如何让它显示在日志中? Viktar Dzemikhau 2013.09.07 05:01 #1247 Forexman77: 你能告诉我如何在开仓时找出点差的大小,或者更好的是,如何在日志中显示它? 如果(传播)==某个值,那么......做一些事情......。(例如,打开一个订单或在日记中打印其价值)。反之亦然,如果它不等于或大于(小于)某个值,那么我们就在日志中显示它并做一些事情。你可以做任何你喜欢的事情。 Viktar Dzemikhau 2013.09.07 05:05 #1248 我将重复我昨天提出的问题。我不想把它贴在一个单独的主题里。如果有什么不清楚的地方,我将回答所有问题。 我仍然很难关闭所需的位置。情况是这样的。 1.正在跟踪关闭职位的情况。 2.一旦最后一个头寸在取款线处关闭......所有未结头寸和待结头寸都应立即关闭。所有的东西都是按批次分类封闭的,也就是说,大批次的东西一次过,然后是小的。这只是为了获得订单方面的经验。 实施情况如下。 在start() 中的每一个刻度上。 for (int ord=OrdersTotal()-1; ord>=0; ord--) { if (!OrderSelect(ord,SELECT_BY_POS)) continue; if (OrderMagicNumber() != i_magic) continue; if (OrderSymbol() != Symbol()) continue; if (OrderType() == 6) continue; g_ticket = OrderTicket(); g_type = OrderType(); // Блок модификации ордеров if (i_sl != 0 || i_tp != 0) { if (OrderStopLoss() == 0 && OrderTakeProfit() == 0) { OrdersModifyer(g_ticket); } } // Закрытие всех ордеров, если последний ордер закрыт if (isCloseByTakeLastOpenPos(2)) { // if (g_type < 2) { ClosePosBySortLots(); } //else if (g_type > 1) { DeletePendingOrders(g_ticket); } } } 我们对关闭市场订单感兴趣,因为待定的订单已按要求删除。下面是我们的情况。 //+-------------------------------------------------------------------------------------+ //| Получаем состояние последней позиции (Открыта или закрыта) | //+-------------------------------------------------------------------------------------+ bool isCloseByTakeLastOpenPos(int delta) { datetime lastOrderCloseTime = -1, // Время закрытия последнего открытого ордера lastOOTHist = -1; // Время открытия последнего открытого ордера из истории int j = -1; pr ("Запустилась функция isCloseByTakeLastOpenPos"); for (int i=OrdersHistoryTotal()-1; i>=0; i--) { if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue; if (OrderMagicNumber() != i_magic) continue; if (OrderSymbol() != Symbol()) continue; if (OrderType() > 1) continue; // Все удалённые отложки нас не интересуют.. if (lastOrderCloseTime < OrderCloseTime()) // Находим время закрытия.. { lastOrderCloseTime = OrderCloseTime(); // ..последней закрытой позиции в истории j = i; pr ("j = " + j + " " + TimeToStr(TimeCurrent())); } } if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) { if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false); // pr ("OTP() = " + OrderTakeProfit() + "; OCP() " + OrderClosePrice() + " " + TimeToStr(TimeCurrent())); // pr ("OOP() = " + OrderOpenPrice() + "; OCP() " + OrderClosePrice() + " " + TimeToStr(TimeCurrent())); if (MathAbs(OrderTakeProfit() - OrderClosePrice()) > delta * pt) return (false); else { lastOOTHist = OrderOpenTime(); Comment("\n", "FUNC isCloseByTakeLastOpenPos: ", "\n", "j = ", j, "\n", "lastOOTHist = ", TimeToStr(lastOOTHist, TIME_SECONDS)); } } else { Comment("\n", "FUNC isCloseByTakeLastOpenPos: ", "\n", "j = ", j, "\n", "не удалось выбрать ордер в истории"); return(false); } for(int h=OrdersTotal()-1; h>=0; h--) { if (OrderSelect(h, SELECT_BY_POS, MODE_TRADES)) { if (OrderMagicNumber() != i_magic) continue; if (OrderSymbol() != Symbol()) continue; if (OrderType() > 1) continue; if (lastOOTHist < OrderOpenTime()) return(false); // Выбранная рыночная позиция открыта позже закрытой по тейку } else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);} } return (true); } //+-------------------------------------------------------------------------------------+ //| Закрытие ордеров, отсортированных по размеру лотов | //+-------------------------------------------------------------------------------------+ void ClosePosBySortLots() { double a[][2]; int p = 0; for (int i=OrdersTotal()-1; i>=0; i--) { if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue; if (OrderMagicNumber() != i_magic) continue; if (OrderSymbol() != Symbol()) continue; if (OrderType() < 2) { p++; ArrayResize(a, p); a[p-1][0] = OrderLots(); a[p-1][1] = OrderTicket(); } } pr ("ClosePosBySortLots(): " + "p = " + p); if (p > 0) { ArraySort(a, WHOLE_ARRAY, 0, MODE_DESCEND); for(i=0; i<p; i++) { if (OrderSelect(a[i][1], SELECT_BY_TICKET, MODE_TRADES)) { if (OrderCloseTime() == 0) ClosePosBySelect(); } } } } //+-------------------------------------------------------------------------------------+ //| Закрытие одного, предварительно выбранного ордера | //+-------------------------------------------------------------------------------------+ void ClosePosBySelect() { bool fc; color clClose, clCloseBuy = Blue, clCloseSell = Red; double ll, pa, pb, pp; int err, it, NumberOfTry = 3; if (OrderType() == OP_BUY || OrderType() == OP_SELL) { for (it=1; it<=NumberOfTry; it++) { while (!IsTradeAllowed()) Sleep(5000); RefreshRates(); pa = MarketInfo(OrderSymbol(), MODE_ASK); pb = MarketInfo(OrderSymbol(), MODE_BID); if (OrderType() == OP_BUY) { pp = pb; clClose = clCloseBuy; } else { pp = pa; clClose = clCloseSell; } ll = OrderLots(); fc = OrderClose(OrderTicket(), ll, pp, 30, clClose); if (fc) { break; } else { err = GetLastError(); } } } else Print("Некорректная торговая операция. Close "); } 由于某些原因,一些订单没有被关闭。我看到一些片段就打印出来,我什么都不懂。下面是一个例子。 评论显示lastOOTHist=01:30:00,尽管这实际上并不正确。如果我们在结果窗口检查lastOOTHist,我们会看到 他们的关门时间是不同的... 这里有什么问题吗? Рустам 2013.09.07 05:07 #1249 hoz: 嗯。这取决于哪个数组被传递给了调用函数。如果它是一个特定的数组,那么被调用的函数将与它一起工作...因为那是...例如,如果。通过这样的称呼。它与OrdersMassive 阵列一起工作就这样。有了massiveOfOrders 数组。 当你把一个变量(数组)按值传递给一个函数时,一个局部变量 在函数内部被创建,你在标题中声明它:myFunct(int my_var)。这样一来,这个变量的变化就不能在函数之外看到。而在数组的情况下,编译器会提醒你这一点。 如果你想让变量值的变化在外面(函数之外)可见,可以通过引用传递变量:myFunct(int& my_var) Artyom Trishkin 2013.09.07 05:17 #1250 hoz: 这取决于哪个数组被传递给了调用函数。如果有一个特定的数组,那么被调用的函数将与它一起工作...是这样的... 例如,如果。 通过这样的称呼。 它与OrdersMassive 阵列一起工作 还有这种方式。 用数组massiveOfOrders 正是如此。这就是我想说的--如果你可以向函数传递任何相同大小和类型的数组,你为什么要在函数本身中硬编码一个特定的数组。 1...118119120121122123124125126127128129130131132...1178 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我本来是这样做的。
P.S. 同时回答))))
我不明白。
如果在第一条街打开,从零到零看?
我不明白。
如果在第一根柱子上打开,我们是否从零开始寻找?
这是一个小的对冲,以防订单的开盘价已经明显高于开盘时的低价。也就是说,我们不使用开放栏进行搜索。这就是PERIOD_M1的作用。
我将以不同的方式来做。一般来说,我只会在该位置持续了一个以上的小节时开始搜索。毕竟,最好的价格可能就在开盘价上,我们会浪费的......
我同意。记忆数组中每个未平仓订单在每个tick 上的最低(或最高)价格,并在达到条件时关闭订单,可能会比从订单开启的那一刻起重新搜索最低价格更有效率。
在出现问题的情况下,如失去连接,重新启动顾问等,我将不时地修改订单的止损。我认为这里的数组必须通过引用来传递。否则,该函数将不得不只与一个严格定义的数组工作。即使你在全球范围内定义了它。
嗯。这取决于哪个数组被传递给了调用函数。如果它是一个特定的数组,那么被调用的函数将与它一起工作...因为那是...
比如说,如果
通过这样的称呼。
它与OrdersMassive 阵列一起工作。
就这样。
有了massiveOfOrders 数组。
你能告诉我如何在开仓时找出点差的大小,或者更好的是,如何在日志中显示它?
如果(传播)==某个值,那么......做一些事情......。(例如,打开一个订单或在日记中打印其价值)。反之亦然,如果它不等于或大于(小于)某个值,那么我们就在日志中显示它并做一些事情。你可以做任何你喜欢的事情。
我将重复我昨天提出的问题。我不想把它贴在一个单独的主题里。如果有什么不清楚的地方,我将回答所有问题。
我仍然很难关闭所需的位置。情况是这样的。
1.正在跟踪关闭职位的情况。
2.一旦最后一个头寸在取款线处关闭......所有未结头寸和待结头寸都应立即关闭。所有的东西都是按批次分类封闭的,也就是说,大批次的东西一次过,然后是小的。这只是为了获得订单方面的经验。
实施情况如下。
在start() 中的每一个刻度上。
我们对关闭市场订单感兴趣,因为待定的订单已按要求删除。下面是我们的情况。
由于某些原因,一些订单没有被关闭。我看到一些片段就打印出来,我什么都不懂。下面是一个例子。
评论显示lastOOTHist=01:30:00,尽管这实际上并不正确。如果我们在结果窗口检查lastOOTHist,我们会看到
他们的关门时间是不同的...
这里有什么问题吗?
嗯。这取决于哪个数组被传递给了调用函数。如果它是一个特定的数组,那么被调用的函数将与它一起工作...因为那是...
例如,如果。
通过这样的称呼。
它与OrdersMassive 阵列一起工作
就这样。
有了massiveOfOrders 数组。
当你把一个变量(数组)按值传递给一个函数时,一个局部变量 在函数内部被创建,你在标题中声明它:myFunct(int my_var)。这样一来,这个变量的变化就不能在函数之外看到。而在数组的情况下,编译器会提醒你这一点。
如果你想让变量值的变化在外面(函数之外)可见,可以通过引用传递变量:myFunct(int& my_var)
这取决于哪个数组被传递给了调用函数。如果有一个特定的数组,那么被调用的函数将与它一起工作...是这样的...
例如,如果。
通过这样的称呼。
它与OrdersMassive 阵列一起工作
还有这种方式。
用数组massiveOfOrders