externstring time1 = "n";// externstring time2="m";
externdouble lot=0.2;// объявили лотexternint 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 свечей М5int 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
}
//+-------------------------------------------------------------------------------------+//| Получаем состояние последней позиции (Открыта или закрыта) |//+-------------------------------------------------------------------------------------+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);
}
//-----------------------------------------------------------------------------------------------+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); // Найденная закрытая по тейку позиция была открыта позже всех, возвращаем её время открытия
}
//-----------------------------------------------------------------------------------------------+
if (isCloseByTakeLastOpenPos (Symbol(), Magic, 5)) { // Если последняя открытая была закрыта по тейку ...// ... тут обрабатываем эту ситуёвину
}
else { // Иначе ...// тут обрабатываем, если последняя закрытая была открыта не последней или ...// ... последняя закрытая была закрыта с убытком или в профите, но за пределами дельты
}
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(); // Тогда время открытия последней закрытой позиции из истории
}
如果现在是7点43分,我还没有睡觉...所以我猜它被拼成了grail!
不,没必要这样说脏话 :))优素福给了我圣杯。我正坐在行李箱里,等待来自天堂的甘露,我要去马尔代夫:))
所以让我看看你做了什么......这里没有心灵感应者--他们在度假。
我已经上传了专家顾问的一般代码,以便更清楚地了解它应该做什么......我知道这很乱,但我还没有学到其他东西=)))
我再一次告诉你它在哪里是愚蠢的
打开一个挂单:打开一个没有相反的挂单,或者在一个方向上打开一大堆挂单。
它删除订单:有时在晚上明确规定的时间可以,有时在一天内可以,或者根本不关闭......。
那么,条件是:
如果第一个未平仓的挂单平仓获利,第二个挂单立即被删除 - 我怀疑我写得是否正确,但我不能在行动中检查,因为我不想开两个相反的仓位(((((。
当搜索最后一个关闭的订单时,我们应该首先找到最近关闭的订单,但在取货时关闭的检查应该移出循环,否则它将检查每个关闭的订单在取货时是否关闭,如果是,它将记住循环中第一个在取货时关闭的订单的时间,而不是最新的订单。 。
嗯,这就是代码优化。在我看来,结果不会改变。它只是需要更长的时间来计算。我确实修改了代码,但还是一样。
不过,还是有一些问题。
我试着给你看一个EA的代码,我知道它很乱,但我从来没有学过如何用其他方式来做)。我将再次告诉你它的愚蠢之处 打开挂单:它要么打开一个挂单而没有相反的挂单,要么在一个方向打开一大堆挂单。删除订单:每次都删除,有时在晚上明确规定的时间就可以,有时在一天内就可以,或者根本就不关闭...... 好吧,条件是: ,如果第一个开立的挂单以盈利收盘,第二个将被立即删除--我也怀疑我写得是否正确,但我不能在工作中检查,因为我不想开立两个相反的位置((((( 。
用一个问题来回答一个问题。那是什么鬼东西。
为我破译,我不明白 :)
开仓 的检查应该是在尝试开仓后进行的。I.e.
你在发送订单后放置它。
价格必须高于或低于Asc或Bid才能开仓。这就是买的情况。
if (OOP > Ask)
嗯,这就是代码优化。在我看来,结果不会改变。它只是需要更长的时间来计算。我确实修改了代码,但还是一样。
它仍然有一些问题。
不,这不是代码优化。它只是在寻找正是最后一个。一旦我们完成了对所有已关闭订单的搜索,并找到了其中最后一个已关闭的订单,只有这样, 我们才应该检查是否被拿下关闭,如果它被拿下关闭,只有这样,继续搜索其余的才有意义。
如果我们在循环内检查一个关闭的,我们会得到什么?我们将得到一个逻辑错误:
假设我们选择了一个一年前关闭的订单。它的时间无论如何都会超过-1,所以我们检查它,以便在采取时关闭它(它在循环内被检查)。是的,它关闭了在采取...你的职能部门接下来会做什么?对--它继续 与 一年前关闭的 那个 订单 一起 工作。让我看看还有什么问题。刚回到家...
书中写道:2.如果最后一个开仓的头寸在拿下时关闭,那么就全部关闭!
所以,事情是这样的。
我们向函数传递我们想要检查的符号,神奇的数字和delta(以点为单位的距离==订单取价和收盘价之间的差异),像这样。
我没有检查过这个函数,是我亲手写的。因此,我将让你们自己去寻找错误。
你可以把它变成int,并使用返回代码。例如,如果你要找的头寸不存在或存在,但它以亏损关闭,则返回-1;
,如果它存在并以盈利关闭,但不在delta范围内,则返回0;
,如果它存在并以盈利关闭且在Take(delta范围内),则返回1。
想象力的空间是巨大的......。
另一方面,如果我们检查收盘情况,我们会得到什么?我们将得到一个逻辑错误。
假设我们选择了一个一年前关闭的订单。它的时间无论如何都会高于-1,所以我们检查它,以便在采取时关闭它(这个循环内的检查包括在代码中)。是的,它关闭了在采取...
所以,如果我们在所有的订单上进行循环,那么这个循环无论如何都会循环所有的订单。每个订单的结束时间将与之前选择的订单进行比较。但这就是我们面临的性能问题。TakeProfit将在循环中不断被检查,每次平仓 都会被检查,而不是只检查最后一次。难道不是这样吗?
对。
但有一个Open[],有一个开盘价。
明白了,谢谢 :)
因此,如果你在所有的订单中循环,循环在任何情况下都会在所有的订单中循环。每个订单的结束时间将与之前选定的订单进行比较。但这就是我们面临的性能问题。TakeProfit将在循环中不断被检查,每次平仓都会被检查,而不是只检查最后一次。难道不是这样吗?
因此,如果你在所有的订单中进行循环,那么这个循环无论如何都会在所有的订单中循环。每个订单的结束时间将与之前选定的订单进行比较。但这里我们有一个性能问题。TakeProfit将在循环中不断被检查,每次平仓都会被检查,而不是只检查最后一次。难道不是这样吗?
这是个小故障。