| / | Форум |
|
Bez
02.07.2006 21:32
Помогите добавить условие открытия ордера на 1 минуту позже
чем закрытия.
// вот мы открываемся, Если D1 то в 00:00, 00:00, если H4 - 00:00, 04:00, 08:00 и тд ............ if(STOCHDO>STOCHnow) //открываемся { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "ADX sample",16384,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); ............ //Вот мы закрываемся ............ if(Close[0]) //закрыть когда закрылась свечка. { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию return(0); // выходим ............Результат таков: Buy 1числа в 00:00 Close 2числа в 00:00 Buy 3числа в 00:00 Close 4числа в 00:00 Как сделать Buy 1числа в 00:01 Close 2числа в 00:00 Buy 2числа в 00:01 Close 3числа в 00:00 Buy 3числа в 00:01 Close 4числа в 00:00 |
|
Увеличьте эффективность групповой работы Поставьте TeamWox и увеличьте эффективность групповой работы в вашей компании. TeamWox позволяет хранить всю рабочую информацию в одном месте: письма, документы, файлы, платежи и история сообщений в чате. Так решается проблема сохранности данных и удобной групповой работы с ними. |
|
SK.
02.07.2006 22:24
Для решения вопроса достаточно отлавливать факт открытия нового
бара.
//----------------------------------------------------------------------------- Новый бар ---- New_Bar = 0; // Для начала обнулимся if (Time_0 != Time[0]) // Если уже другое время начала бара { New_Bar = 1; // А вот и новый бар Time_0 = Time[0]; // Запомним время начала нового бара } //-------------------------------------------------------------------------------------------- if(New_Bar == 1) { ... // Торговые операци } //--------------------------------------------------------------------------------------------Насколько я понимаю, минута паузы здесь не принципиальна. Если же принципиальна, то можно перед соответствующей торг. операцией поставить задержку Sleep(60000) или запомнить время открытия нового бара и анализировать текущее время, и по прошествии минуты осуществлять решение. |
|
Bez
03.07.2006 11:25
Почему не получается?
//+------------------------------------------------------------------+ //| MACD Sample.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ extern double TakeProfit = 400; extern double Lots = 0.1; extern double TrailingStop = 100; extern double KPeriod=5; extern double DPeriod=3; extern double Slowing=3; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { double STOCHDO, STOCHnow, New_Bar, Time_0; int cnt=0, ticket, total; // первичные проверки данных // важно удостовериться что эксперт работает на нормальном графике и // пользователь правильно выставил внешние переменные (Lots, StopLoss, // TakeProfit, TrailingStop) // в нашем случае проверяем только TakeProfit if(Bars<100) { Print("bars less than 100"); return(0); } if(TakeProfit<10) { Print("TakeProfit less than 10"); return(0); // проверяем TakeProfit } // ради упрощения и ускорения кода, сохраним необходимые // данные индикаторов во временных переменных STOCHDO=iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,1); STOCHnow=iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,0); New_Bar = 0; // Для начала обнулимся total=OrdersTotal(); if(total<1) { // нет ни одного открытого ордера if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } // проверяем на возможность встать в длинную позицию (BUY) if(Time_0 != Time[0])//STOCHDO<STOCHnow) { New_Bar = 1; // А вот и новый бар Time_0 = Time[0]; // Запомним время начала нового бара } if(New_Bar == 1) Sleep(60000); { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point, "ADX sample",16384,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return(0); } // проверяем на возможность встать в короткую позицию (SELL) if(Time_0 != Time[0])//STOCHDO<STOCHnow) { New_Bar = 1; // А вот и новый бар Time_0 = Time[0]; // Запомним время начала нового бара } if(New_Bar == 1) Sleep(60000); { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point, "ADX sample",16384,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); return(0); } return(0); } // переходим к важной части эксперта - контролю открытых позиций // 'важно правильно войти в рынок, но выйти - еще важнее...' for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && // это открытая позиция? OP_BUY или OP_SELL OrderSymbol()==Symbol()) // инструмент совпадает? { if(OrderType()==OP_BUY) // открыта длинная позиция { // проверим, может уже пора закрываться? if(Close[0]) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию return(0); // выходим } // проверим - может можно/нужно уже трейлинг стоп ставить? if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop, OrderTakeProfit(),0,Green); return(0); } } } } else // иначе это короткая позиция { // проверим, может уже пора закрываться? if(Close[0]) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // закрываем позицию return(0); // выходим } // проверим - может можно/нужно уже трейлинг стоп ставить? if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop, OrderTakeProfit(),0,Red); return(0); } } } } } } return(0); } // конец. |
|
SK.
03.07.2006 11:59
if(New_Bar == 1) Sleep(60000); {На новом баре только то и делается, что выдерживается минутная пауза. Небрежное и неаккуратное программирование часто приводит к алгоритмическим ошибкам. Выровняйте код, разделите его на логческие фрагменты, напишите комментарии. |
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий