Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Хорошо, я разобрался с расчетом поворотных точек. Спасибо за помощь.
Проблема, с которой я столкнулся сейчас, заключается в том, что когда он правильно открывает отложенный ордер в правильном ценовом месте, он продолжает открывать отложенные ордера снова и снова каждый раз, когда цена движется на 1 пункт.
Я искал и буду продолжать исследовать, почему это происходит, но хотел узнать, не могли бы вы подсказать мне или помочь, если вы видите логическую ошибку, которую я делаю.
Как всегда, спасибо за ваше время.
extern int look_price_hour = 1; // Change for your time zone (my is +1 Hour). Should be 9AM London time.
extern int look_price_min = 35; // Offset in minutes when to look on price.
extern int close_hour = 12; // Close all orders after this hour
bool use_close_hour = true; // set it to false to ignore close_hour
int take_profit = 20;
extern int Currency_Spread = 4;
int open_long = 21;
int open_short = 21;
int stop_long = 30;
int stop_short = 30;
extern int slippage = 0;// Put what your brooker requires
extern double lots = 0.20; // Position size
extern int magic = 123;
bool clear_to_send = true;
void ReportStrategy()
{
int totalorders = HistoryTotal();
double StrategyProfit = 0.0;
double StrategyProfitOpen = 0.0;
int StrategyOrders = 0;
int StrategyOrdersOpen = 0;
for(int j=0; j<totalorders;j++)
{ if(OrderSelect(j, SELECT_BY_POS, MODE_HISTORY) &&
(OrderMagicNumber() == magic))
{
if((OrderType() == OP_BUY) ||
(OrderType() == OP_SELL))
{
StrategyOrders++;
StrategyProfit += OrderProfit();
}
}
}
totalorders = OrdersTotal();
for(j=0; j<totalorders;j++)
{ if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES) &&
(OrderMagicNumber() == magic))
{
if((OrderType() == OP_BUY) ||
(OrderType() == OP_SELL))
{
StrategyOrdersOpen++;
StrategyProfitOpen += OrderProfit();
}
}
}
Comment("Daily20Pip EA Executed ", StrategyOrders,"+",StrategyOrdersOpen, " trades with ", StrategyProfit,"+",
StrategyProfitOpen," = ",StrategyProfit+StrategyProfitOpen," of profit\n",
"Server hour: ", TimeHour(CurTime()), " Local hour: ", TimeHour(LocalTime()));
return;
}
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
ReportStrategy();
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
ReportStrategy();
if(Hour() >= close_hour &&
use_close_hour){
// we are after closing time
int totalorders = OrdersTotal();
for(int j=0;j<totalorders;j++){
OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() &&
OrderMagicNumber() == magic){
if(OrderType() == OP_BUY)
OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);
if(OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);
if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)
OrderDelete(OrderTicket());
}
}
return(0);
}
if(Hour() == look_price_hour &&
Minute() >= look_price_min &&
clear_to_send){
// Probably I need to close any old positions first:
totalorders = OrdersTotal();
for(j=0;j<totalorders;j++){
OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() &&
OrderMagicNumber() == magic){
if(OrderType() == OP_BUY)
OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);
if(OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);
if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)
OrderDelete(OrderTicket());
}
}
}
double PIVOT;
PIVOT = (iHigh(NULL,PERIOD_D1,1) + iLow(NULL,PERIOD_D1,1) + iClose(NULL,PERIOD_D1,1))/3;
// Send orders:
OrderSend(Symbol(),
OP_BUYSTOP,
lots,
PIVOT+(open_long+Currency_Spread)*Point, // Spread included
slippage,
PIVOT+((open_long+Currency_Spread)-stop_long)*Point,
PIVOT+((open_long+Currency_Spread)+take_profit)*Point,
NULL,
magic,
0,
FireBrick);
OrderSend(Symbol(),
OP_SELLSTOP,
lots,
PIVOT-open_short*Point,
slippage,
PIVOT-(open_short-stop_short)*Point,
PIVOT-(open_short+take_profit)*Point,
NULL,
magic,
0,
FireBrick);
clear_to_send = false; // mark that orders are sent
if(!clear_to_send){ // there are active orders
int long_ticket = -1;
int short_ticket = -1;
bool no_active_order = true;
totalorders = OrdersTotal();
for(j=0;j<totalorders;j++){
OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() &&
OrderMagicNumber() == magic){
if(OrderType() == OP_BUYSTOP)
long_ticket = OrderTicket();
if(OrderType() == OP_SELLSTOP)
short_ticket = OrderTicket();
if(OrderType() == OP_BUY ||
OrderType() == OP_SELL) // Active order
no_active_order = false; }
}
if(short_ticket == -1 && long_ticket != -1)
OrderDelete(long_ticket);
if(long_ticket == -1 && short_ticket != -1)
OrderDelete(short_ticket);
if(long_ticket == -1 && short_ticket == -1 && no_active_order &&
Hour() != look_price_hour && Minute() >= look_price_min)
clear_to_send = true;
if(Hour() == (look_price_hour-1) &&
MathAbs(Minute() - look_price_min) < 10)
clear_to_send = true;
}
//----
return(0);
}
По поводу моего предыдущего сообщения,
Похоже, что "clear_to_send = false;" не переключается после отложенного ордера. Есть идеи?
Это произошло, когда я сделал разворот точкой отсчета для отложенных ордеров. Если я не могу решить эту логику, тогда я думаю, я попытаюсь выяснить, как ссылаться на пивот из индикатора и вызывать его из советника. Не уверен, что это возможно, но я вижу эти варианты.
Любой совет или помощь будут приняты с благодарностью.
extern int look_price_hour = 1; // Change for your time zone (my is +1 Hour). Should be 9AM London time.
extern int look_price_min = 35; // Offset in minutes when to look on price.
extern int close_hour = 12; // Close all orders after this hour
bool use_close_hour = true; // set it to false to ignore close_hour
int take_profit = 20;
extern int Currency_Spread = 4;
int open_long = 21;
int open_short = 21;
int stop_long = 30;
int stop_short = 30;
extern int slippage = 0;// Put what your brooker requires
extern double lots = 0.20; // Position size
extern int magic = 123;
bool clear_to_send = true;
void ReportStrategy()
{
int totalorders = HistoryTotal();
double StrategyProfit = 0.0;
double StrategyProfitOpen = 0.0;
int StrategyOrders = 0;
int StrategyOrdersOpen = 0;
for(int j=0; j<totalorders;j++)
{ if(OrderSelect(j, SELECT_BY_POS, MODE_HISTORY) &&
(OrderMagicNumber() == magic))
{
if((OrderType() == OP_BUY) ||
(OrderType() == OP_SELL))
{
StrategyOrders++;
StrategyProfit += OrderProfit();
}
}
}
totalorders = OrdersTotal();
for(j=0; j<totalorders;j++)
{ if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES) &&
(OrderMagicNumber() == magic))
{
if((OrderType() == OP_BUY) ||
(OrderType() == OP_SELL))
{
StrategyOrdersOpen++;
StrategyProfitOpen += OrderProfit();
}
}
}
Comment("Daily20Pip EA Executed ", StrategyOrders,"+",StrategyOrdersOpen, " trades with ", StrategyProfit,"+",
StrategyProfitOpen," = ",StrategyProfit+StrategyProfitOpen," of profit\n",
"Server hour: ", TimeHour(CurTime()), " Local hour: ", TimeHour(LocalTime()));
return;
}
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
ReportStrategy();
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
ReportStrategy();
if(Hour() >= close_hour &&
use_close_hour){
// we are after closing time
int totalorders = OrdersTotal();
for(int j=0;j<totalorders;j++){
OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() &&
OrderMagicNumber() == magic){
if(OrderType() == OP_BUY)
OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);
if(OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);
if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)
OrderDelete(OrderTicket());
}
}
return(0);
}
if(Hour() == look_price_hour &&
Minute() >= look_price_min &&
clear_to_send){
// Probably I need to close any old positions first:
totalorders = OrdersTotal();
for(j=0;j<totalorders;j++){
OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() &&
OrderMagicNumber() == magic){
if(OrderType() == OP_BUY)
OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);
if(OrderType() == OP_SELL)
OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);
if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)
OrderDelete(OrderTicket());
}
}
}
double PIVOT;
PIVOT = (iHigh(NULL,PERIOD_D1,1) + iLow(NULL,PERIOD_D1,1) + iClose(NULL,PERIOD_D1,1))/3;
// Send orders:
if (clear_to_send){
OrderSend(Symbol(),
OP_BUYSTOP,
lots,
PIVOT+(open_long+Currency_Spread)*Point, // Spread included
slippage,
PIVOT+((open_long+Currency_Spread)-stop_long)*Point,
PIVOT+((open_long+Currency_Spread)+take_profit)*Point,
NULL,
magic,
0,
FireBrick);
OrderSend(Symbol(),
OP_SELLSTOP,
lots,
PIVOT-open_short*Point,
slippage,
PIVOT-(open_short-stop_short)*Point,
PIVOT-(open_short+take_profit)*Point,
NULL,
magic,
0,
FireBrick);
clear_to_send = false; // mark that orders are sent
}
if(!clear_to_send){ // there are active orders
int long_ticket = -1;
int short_ticket = -1;
bool no_active_order = true;
totalorders = OrdersTotal();
for(j=0;j<totalorders;j++){
OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() &&
OrderMagicNumber() == magic){
if(OrderType() == OP_BUYSTOP)
long_ticket = OrderTicket();
if(OrderType() == OP_SELLSTOP)
short_ticket = OrderTicket();
if(OrderType() == OP_BUY ||
OrderType() == OP_SELL) // Active order
no_active_order = false; }
}
if(short_ticket == -1 && long_ticket != -1)
OrderDelete(long_ticket);
if(long_ticket == -1 && short_ticket != -1)
OrderDelete(short_ticket);
if(long_ticket == -1 && short_ticket == -1 && no_active_order &&
Hour() != look_price_hour && Minute() >= look_price_min)
clear_to_send = true;
if(Hour() == (look_price_hour-1) &&
MathAbs(Minute() - look_price_min) < 10)
clear_to_send = true;
}
//----
return(0);
}
Попробуйте использовать этот код.
Рянклефас
Вы просто гениальны в этой области.
Тестирование, которое я провел по вашей модификации, сработало.
Не уверен, почему добавление логики поворота вмешалось в текущую логику "Если". Возможно, мне нужно было установить код поворота в другом месте. Однако я вижу, как вы изолировали код отложенного ордера, и это работает до сих пор.
Спасибо за URL, который указал мне на примеры кода. Это будет отличным ресурсом по мере того, как я буду совершенствовать свои навыки программирования.
Я нахожу интересным/раздражающим то, как решение одной проблемы иногда вызывает другую.
Текущая проблема: Теперь мне нужно выяснить, почему этот код позволяет отложенные ордера только для цен с 5 цифрами, а не с 3.
Пример: 1.1234 работает нормально, но 1.12 выдает ошибку, что 1.123333 не является допустимой ценой для OrderSend.
Таким образом, это работает на GBP/USD, но не на USD/JPY.
Еще раз спасибо за ваше время.
Ryanklefas ,
Вы просто гениальны в этой области.
Спасибо.
Что касается вашей проблемы:
Убедитесь, что перед отправкой значений pivot в функцию orderSend вы нормализовали их с помощью функции NormalizeDouble; используйте предварительно заданное значение "Digits" в качестве второго параметра для округления двойки до соответствующего количества цифр для вашей валюты.
Моя проблема заключается в том, как округлить вычисленное значение до ближайшего десятичного знака.
Я думаю, что функция normalizeDouble тоже подойдет. Я также видел код, использующий функции MathFloor и MathCeiling для достижения того же самого.
Еще одна помощь
Кто-нибудь может сказать мне, как это сделать?
Может ли кто-нибудь сказать мне, как это сделать?
Я думаю, это связано с этой темой https://www.mql5.com/en/forum/176969.
Установка цвета уровня в коде
Может ли кто-нибудь показать мне, как я могу установить level1 30 в зеленый цвет, а leve2 70 в красный?
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
#property indicator_level1 30
#property indicator_level2 70
#property indicator_minimum 0
#property indicator_maximum 100
Заранее спасибо
Может ли кто-нибудь показать мне, как я могу установить level1 30 на Green, а leve2 70 на Red?
#свойство indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
#property indicator_level1 30
#property indicator_level2 70
#property indicator_minimum 0
#property indicator_maximum 100
Заранее спасибоЯ думаю, что этот раздел MetaEditor будет тем, что вы ищете:
MQL4 Reference - Basics - Preprocessor - Controlling compilation