任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 103

 
hoz:

如果现在是7点43分,我还没有睡觉...所以我猜它被拼成了grail!

不,没必要这样说脏话 :))优素福给了我圣杯。我正坐在行李箱里,等待来自天堂的甘露,我要去马尔代夫:))

 
artmedia70:
所以让我看看你做了什么......这里没有心灵感应者--他们在度假。

extern string time1 = "n";// 
extern string time2="m";
extern double lot=0.2;// объявили лот
extern int slippage=2;// объявили макс отклонение от цены





int start()
{
double max;// максимальная цена 6-ти свечей
double min;// минимальная цена 6-ти свечей
int hour1 = TimeHour(StrToTime(time1)); // время часы
int minute1 = TimeMinute(StrToTime(time1));// время минуты


if (hour1 == TimeHour(TimeCurrent()) && minute1 == TimeMinute(TimeCurrent()))// если время подошло то
{
min=Low[iLowest(Symbol(),0,MODE_LOW,6,1)]; // вычисляем минимальную цену последних 6 свечей
max=High[iHighest(Symbol(),0,MODE_HIGH,6,1)]; // вычисляем максимальную цену последних 6 свечей
double volum=max-min;// общий объем локалки последних 6 свечей М5
 int ticket1=-1;
 int ticket2=-1;
if ((volum<=0.0018)==true)// если объем свечей меньше или равно z пунктов 

if (ticket1<0)
{ 
OrderSend ( Symbol (), OP_BUYSTOP, lot,max+Point,3,min-Point,max+0.0022, NULL,0,time2, Red);
Alert(GetLastError());
}
if(ticket2<0)
{
OrderSend( Symbol (), OP_SELLSTOP, lot,min-Point,3,max+Point,min-0.0022, NULL,0,time2, Yellow);
Alert(GetLastError());
}


return;


if (OrderSelect(1,SELECT_BY_POS,MODE_HISTORY)) ///если первый открытый ордер закрылся с профитом 
if(OrderProfit()>0)
{
OrderDelete(OrderTicket());// удаляем второй отложенный
}

}



bool closeorder;//определим переменную закрытия ордеров
closeorder=true;

if (closeorder==true)// вечернее закрытие всех отложенных ордеров, и рыночных позиций
{
int hour2 = TimeHour(StrToTime(time2));// вычисляем время закрытия ордеров
int minute2 = TimeMinute(StrToTime(time2));

if (hour2 == TimeHour(TimeCurrent()) && minute2 == TimeMinute(TimeCurrent()))// если время ***
{// определяем количество открытых позиций, и отложенных ордеров
for(int i=OrdersTotal()-1; i>=0; i--)
 if (OrderSelect(1,SELECT_BY_POS,MODE_TRADES))break; //определяем место где будем искать ( рабочие позиции)
if (OrderType()==OP_BUY ) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),slippage);// Закрытие ордера бай если такой есть
if (OrderType()==OP_SELL) OrderClose (OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),slippage);//Закрытие ордера селл если такой есть
if (OrderType()==OP_BUYSTOP)
{ 
OrderDelete(OrderTicket()); //удаляем отложенный байстоп
}                    
if(OrderType()==OP_SELLSTOP)
{ 
OrderDelete(OrderTicket()); //удаляем отложенный sellstop
}                    

我已经上传了专家顾问的一般代码,以便更清楚地了解它应该做什么......我知道这很乱,但我还没有学到其他东西=)))
我再一次告诉你它在哪里是愚蠢的
打开一个挂单:打开一个没有相反的挂单,或者在一个方向上打开一大堆挂单。
它删除订单:有时在晚上明确规定的时间可以,有时在一天内可以,或者根本不关闭......。

那么,条件是:
如果第一个未平仓的挂单平仓获利,第二个挂单立即被删除 - 我怀疑我写得是否正确,但我不能在行动中检查,因为我不想开两个相反的仓位(((((。
 
artmedia70:
当搜索最后一个关闭的订单时,我们应该首先找到最近关闭的订单,但在取货时关闭的检查应该移出循环,否则它将检查每个关闭的订单在取货时是否关闭,如果是,它将记住循环中第一个在取货时关闭的订单的时间,而不是最新的订单。 。


嗯,这就是代码优化。在我看来,结果不会改变。它只是需要更长的时间来计算。我确实修改了代码,但还是一样。

//+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
datetime GetLastOrderState()
{
   datetime lastOrderCloseTime = -1,               // Время закрытия последнего открытого ордера
            lastOOTMarket = -1,          // Время открытия последнего открытого ордера рыночного
            lastOOTHist = -1;            // Время открытия последнего открытого ордера из истории
   
   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();   // ..последней закрытой позиции в истории
      Comment("Время закрытия последнего ордера в истории lastOrderCloseTime = ", lastOrderCloseTime);
   }

   if (MathAbs(OrderTakeProfit() - OrderOpenPrice()) < i_tp * pt) return(0);
      Comment("OrderTakeProfit() - OrderOpenPrice() < i_tp * pt = ", MathAbs(OrderTakeProfit() - OrderOpenPrice()) < i_tp * pt);
   lastOOTHist = OrderOpenTime();   // Тогда время открытия последней закрытой позиции из истории
      Comment("Время закрытия последнего ордера в истории lastOOTHist = ", lastOOTHist);
   
      Comment("Время открытия последнего открытого ордера = ", lastOOTHist);
  
   for (int h=OrdersTotal()-1; i>=0; i--)
   {   
      if (!OrderSelect(h, SELECT_BY_POS, MODE_TRADES)) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if (OrderSymbol() != Symbol()) continue;
      {
         if (lastOOTMarket < OrderOpenTime())
             lastOOTMarket = OrderOpenTime();
  
         if (lastOOTMarket < lastOOTHist)      // Если время открытия последнего открытого ордера (рыночного) ниже последнего открытого ордера из истории..
             lastOrderCloseTime = OrderCloseTime(); // Значит это искомый ордер
      }
   }

   Comment("Время закрытия последнего открытого ордера = ", lastOrderCloseTime);
   return (lastOrderCloseTime);
}

不过,还是有一些问题。

 
ex1m:

我试着给你看一个EA的代码,我知道它很乱,但我从来没有学过如何用其他方式来做)。我将再次告诉你它的愚蠢之处 打开挂单:它要么打开一个挂单而没有相反的挂单,要么在一个方向打开一大堆挂单。删除订单:每次都删除,有时在晚上明确规定的时间就可以,有时在一天内就可以,或者根本就不关闭...... 好吧,条件是: ,如果第一个开立的挂单以盈利收盘,第二个将被立即删除--我也怀疑我写得是否正确,但我不能在工作中检查,因为我不想开立两个相反的位置((((( 。









用一个问题来回答一个问题。那是什么鬼东西。

if ((volum<=0.0018)==true)// если объем свечей меньше или равно z пунктов 

为我破译,我不明白 :)

开仓 的检查应该是在尝试开仓后进行的。I.e.

if (ticket1<0)

你在发送订单后放置它。

价格必须高于或低于Asc或Bid才能开仓。这就是买的情况。

 if (OOP > Ask)
 
hoz:


嗯,这就是代码优化。在我看来,结果不会改变。它只是需要更长的时间来计算。我确实修改了代码,但还是一样。

它仍然有一些问题。

不,这不是代码优化。它只是在寻找正是最后一个。一旦我们完成了对所有已关闭订单的搜索,并找到了其中最后一个已关闭的订单,只有这样, 我们才应该检查是否被拿下关闭,如果它被拿下关闭,只有这样,继续搜索其余的才有意义。

如果我们在循环内检查一个关闭的,我们会得到什么?我们将得到一个逻辑错误:
假设我们选择了一个一年前关闭的订单。它的时间无论如何都会超过-1,所以我们检查它,以便在采取时关闭它(它在循环内被检查)。是的,它关闭了在采取...你的职能部门接下来会做什么?对--它继续 一年前关闭的 那个 订单 一起 工作。让我看看还有什么问题。刚回到家...

 

书中写道:2.如果最后一个开仓的头寸在拿下时关闭,那么就全部关闭!

所以,事情是这样的。

//-----------------------------------------------------------------------------------------------+
bool isCloseByTakeLastOpenPos (string sy, int mn, int delta) {
   datetime t=0;
   int   i, k, j=-1;
   
// Сначала определим, что последняя закрытая позиция была закрыта по тейку (в пределах дельты)
   k=OrdersHistoryTotal()-1;
   for(i=k; i>=0; i--) {
      if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (OrderType()>1)            continue;            // Сначала забыл вписать, подправил
         if (t<OrderCloseTime()) {t=OrderCloseTime(); j=i;}
         }
      }  
   // Нашли последнюю. Проверим её закрытие по тейку
   if (OrderSelect(j,SELECT_BY_POS,MODE_HISTORY)) {                      
      if (OrderProfit()+OrderSwap()+OrderCommission()<=0)   return(false);          // Закрыта с убытком или в ноль
      if (MathAbs(OrderTakeProfit()-OrderClosePrice())>delta*Point) return(false);  // закрыта в профите, но не в пределах дельты
      else t=OrderOpenTime();    // Если последняя закрытая была закрыта по тейку (в пределах дельты), запомним время её открытия
      }
   else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать ордер в истории");return(false);}
// Здесь мы имеем последнюю закрытую позицию в профите и закрытую по тейку (в пределах дельты), ищем дальше
   k=OrdersTotal()-1;
   for(i=k; i>=0; i--) {
      if (OrderSelect(i,SELECT_BY_POS)) {
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (OrderType()>1)            continue;
         if (t<OrderOpenTime()) return(false);  // Выбранная рыночная позиция открыта позже закрытой по тейку
         }
      else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);}
      }
   return(true);  // Найденная закрытая по тейку позиция была открыта позже всех, возвращаем её время открытия
}
//-----------------------------------------------------------------------------------------------+

我们向函数传递我们想要检查的符号,神奇的数字和delta(以点为单位的距离==订单取价和收盘价之间的差异),像这样。

   if (isCloseByTakeLastOpenPos (Symbol(), Magic, 5)) { // Если последняя открытая была закрыта по тейку ...
      // ... тут обрабатываем эту ситуёвину
      }
   else {   // Иначе ...
      // тут обрабатываем, если последняя закрытая была открыта не последней или ...
      // ... последняя закрытая была закрыта с убытком или в профите, но за пределами дельты
      }

我没有检查过这个函数,是我亲手写的。因此,我将让你们自己去寻找错误

你可以把它变成int,并使用返回代码。例如,如果你要找的头寸不存在或存在,但它以亏损关闭,则返回-1;
,如果它存在并以盈利关闭,但不在delta范围内,则返回0;
,如果它存在并以盈利关闭且在Take(delta范围内),则返回1。

想象力的空间是巨大的......。

 
artmedia70:

另一方面,如果我们检查收盘情况,我们会得到什么?我们将得到一个逻辑错误。

假设我们选择了一个一年前关闭的订单。它的时间无论如何都会高于-1,所以我们检查它,以便在采取时关闭它(这个循环内的检查包括在代码中)。是的,它关闭了在采取...


所以,如果我们在所有的订单上进行循环,那么这个循环无论如何都会循环所有的订单。每个订单的结束时间将与之前选择的订单进行比较。但这就是我们面临的性能问题。TakeProfit将在循环中不断被检查,每次平仓 都会被检查,而不是只检查最后一次。难道不是这样吗?
 
PapaYozh:

对。

但有一个Open[],有一个开盘价。


明白了,谢谢 :)
 
hoz:

因此,如果你在所有的订单中循环,循环在任何情况下都会在所有的订单中循环。每个订单的结束时间将与之前选定的订单进行比较。但这就是我们面临的性能问题。TakeProfit将在循环中不断被检查,每次平仓都会被检查,而不是只检查最后一次。难道不是这样吗?
我已经写了一个关于该功能的例子。
 
hoz:

因此,如果你在所有的订单中进行循环,那么这个循环无论如何都会在所有的订单中循环。每个订单的结束时间将与之前选定的订单进行比较。但这里我们有一个性能问题。TakeProfit将在循环中不断被检查,每次平仓都会被检查,而不是只检查最后一次。难道不是这样吗?

这是个小故障。

   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();   // ..последней закрытой позиции в истории
      
      if (MathAbs(OrderTakeProfit() - OrderOpenPrice()) < i_tp * pt) return(0); // ЗДЕСЬ ВЫХОДИМ ПРИ ПЕРВОМ ВСТРЕЧНОМ
      
      lastOOTHist = OrderOpenTime();   // Тогда время открытия последней закрытой позиции из истории
   }