Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Посмотрите на эту тему: https://www.mql5.com/en/forum/178677
Посмотрите эту тему: https://www.mql5.com/en/forum/178677
большое спасибо, за инструкцию по открытию файла и ссылку на скачивание.
10points3
ПЛИАААСИ, ПРОГРАММИСТЫ!
Нужно в советнике 10points3, чтобы при открытии третьей сделки, первая закрывалась, я пытаюсь, но он все равно закрывает все позиции.
на самом деле у нас есть:
if (PreviousOpenOrders>OpenOrders)
{
for(cnt=OrdersTotal();cnt>=0;cnt--)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
mode=OrderType();
if (OrderSymbol()==Symbol() && OrderMagicNumber() == Magic)
{
if (mode==OP_BUY) { OrderClose(OrderTicket(),OrderLots(),OrderClosePri ce(),slippage,Blue); }
if (mode==OP_SELL) { OrderClose(OrderTicket(),OrderLots(),OrderClosePri ce(),slippage,Red); }
return(0);
}
Я думал сделать следующее:
1. при открытии второй сделки изменить магическое число для первой сделки, например magicnumber+1
2. когда открывается третья сделка, закрываем первую, с присвоенным magicnumber+1.
Я прав?
Или каким другим способом я могу определить первую открытую сделку, чтобы закрыть ее позже?
Если вы можете направить меня или сделать изменения, лучше, потому что я не программист, я только учусь.
Это изменение было бы началом Голли Грааля!!!
10 пунктов3
Извините, советник.
Он находится в этой теме:
https://www.mql5.com/en/forum/174975
Спасибо!
помощь в программировании - оператор возврата
здравствуйте
Я начинающий программист в mt4 и сейчас часто пытаюсь найти решение для фиксации переменных из функции void в основной программе "start()".
ниже вы можете увидеть пример и вопрос в том, как я могу зафиксировать значение переменных "CountOpenSell", "CountOpenBuy", "ProfitSell" и "ProfitBuy" в start() - mainprogram..........
Я добавил свое предложение (return`ы выделены жирным шрифтом), но я не знаю, правильно ли это и как правильно написать код для основной программы "start()"?
Извините за мой плохой английский и за помощь
большое спасибо
с уважением
forex2006
void CallBuySellProfit()
{ ProfitBuy=0;
ProfitSell=0;
CountOpenSell=0;
CountOpenBuy=0;
for (i=OrdersTotal()-1;i>=0;i--)
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderType()==OP_SELL) {ProfitSell = ProfitSell + OrderProfit();CountOpenSell++;}
if (OrderType()==OP_BUY) {ProfitBuy = ProfitBuy + OrderProfit();CountOpenBuy++;}
}
else Print("Ошибка при выборе ордера ", GetLastError());
}
return(CountOpenSell);
return(CountOpenBuy);
return(ProfitSell);
return(ProfitBuy);
}
помощь в программировании forex2006 - оператор return
Привет, forex2006,
Если вы действительно хотите изучить mql, я бы посоветовал вам попробовать учебники от codersguru, именно с них я начинал. Что касается вашего вопроса, функция void не может вернуть значение, если вы хотите получить значения из функций void, вы должны использовать глобальные переменные. Лучший способ получить значения - использовать функцию, которая возвращает значение, используя параметры, указывающие, какие значения вы хотите получить. Ниже приведен простой пример. Старайтесь избегать использования глобальных переменных в функциях, так как это может затруднить вашу дальнейшую работу.
Надеюсь, это поможет
int start()
{
double ProfitBuy = CallBuySellProfit(OP_BUY,false);
double ProfitSell = CallBuySellProfit(OP_SELL,false);
int CountOpenBuy = CallBuySellProfit(OP_BUY,true);
int CountOpenSell = CallBuySellProfit(OP_SELL,true);
Comment("ProfitBuy: "+DoubleToStr(ProfitBuy,2) +"\n "+
"ProfitSell: "+DoubleToStr(ProfitSell,2) +"\n "+
"CountOpenBuy: "+DoubleToStr(CountOpenBuy,2)+"\n "+
"CountOpenSell: "+DoubleToStr(CountOpenSell,2)+"\n "+
"");
return;
}
double CallBuySellProfit(int iOrderType, bool bCount)
{
double dProfit = 0;
int iCount = 0;
for (int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderType()==iOrderType)
{
dProfit = dProfit + OrderProfit();
iCount++;
}
}
else
{
Print("Ошибка при выборе заказа ", GetLastError());
}
}//end for
if(bCount)return(iCount);
else return(dProfit);
}//end CallBuySellProfit
Остановить торговлю советника на одном и том же баре
Здравствуйте, подскажите, как можно написать код, чтобы советник проверял, были ли уже сделки на этом баре, а затем не совершал больше сделок до нового бара?
Спасибо
matrixebiz, рассматривали ли вы возможность открытия и закрытия сделки на одной и той же свече до того, как свеча закрылась? возможно, вам также следует проверить список истории.
Я всегда портировал эту небольшую функцию, которую я написал, на все мои советники, возможно, вы тоже найдете ее полезной.
bool DecideToOpenTrade()
{
int total = OrdersTotal();
if (total > 0)
{
for(int cnt=0;cnt<total;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber() == EA_MAGIC_NUM)
{
return (false);
}
}
}
}
// in case trades has already opened and closed within the candle
int histotal = OrdersHistoryTotal();
if (histotal > 0)
{
for(cnt=0;cnt<histotal;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber() == EA_MAGIC_NUM)
{
if (Time[0] <= OrderOpenTime()) // don't open a new position if we're still on the same candle
{
return (false);
}
}
}
}
}
return (true);
}
int start()
{
// some time check codes first.. blah blah
// ...
// ...
// ...
// check signals
if (Should_Buy())
{
if (DecideToOpenTrade())
{
//... trade opening codes here
}
}
if (Should_Sell())
{
if (DecideToOpenTrade())
{
//... trade opening codes here
}
}
}
Примечание: эта функция предполагает, что вы установили уникальное значение EA_MAGIC_NUM. Таким образом, проверка не будет просматривать сделки, открытые другими советниками.
Should_Buy() и Should_Sell() - это функции, которые я создаю во всех своих советниках, чтобы определить, произошел ли сигнал на покупку или продажу.
Надеюсь, это поможет. Напишите мне, если вам нужны дополнительные разъяснения.
с уважением,
Zen
обновленный пост ниже...
Кажется, это работает для меня Спасибо.
void DesideToOpen()
//----------------------------------------------------------------+
//----------------------------------------------------------------+
{
int total = OrdersTotal();
if (total > 0)
{
for(int cnt=0;cnt<total;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS))
{
if(OrderComment() == EA_Name + MagicNumber) DecideToOpenTrade = false;
}
}
}
// in case trades has already opened and closed within the candle
int histotal = OrdersHistoryTotal();
if (histotal > 0)
{
for(cnt=0;cnt<histotal;cnt++)
{
if(OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderComment() == EA_Name + MagicNumber)
{
if (Time[0] <= OrderOpenTime()) DecideToOpenTrade = false; // don't open a new position if we're still on the same candle
}
}
}
}
}