Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Будьте осторожны при использовании OrderComment() для идентификации сделок. Иногда брокер добавляет символы в комментарий.
Лучше всего использовать
if (StringFind(OrderComment(), UserComment, 0) > 0)
{
// заказ, идентифицированный по UserComment, найден в OrderComment
}
вместо
if (OrderComment() == UserComment)
{
// ордер может быть идентифицирован UserComment
// если OrderComment не был изменен брокером
}
РобертИменно так ... И еще, иногда оригинальный комментарий, закодированный в советнике, слишком длинный и будет тронкирован платформой (не уверен, что остальная часть комментария находится в "памяти", но она не отображается в колонке комментариев).
FerruFx
нужна помощь с моим советником
привет,
Я работаю над советником, который открывает длинные и короткие позиции одновременно и я столкнулся с такой проблемой... когда оба типа позиций открыты, скажем, первая короткая, а вторая длинная... советник не будет закрывать длинную позицию, если короткая все еще открыта, он будет ждать, пока короткая будет закрыта, а затем закроет длинную, когда условия будут выполнены и наоборот. вот ниже часть советника, где он должен закрыть открытые позиции:
//---- Закрыть открытые позиции
for(int cnt=0; cnt<total; cnt++)
{
OrderSelect(cnt, SELECT_BY_POS);
{
//-- Закрыть длинную позицию
if(OrderSymbol() == Symbol() && OrderType()==OP_BUY && rsi1>75 && rsi<75)
{
OrderClose(OrderTicket(),OrderLots(),Bid,5,Green);
LotL=Lot;
}
//-- Закрываем шорт
if(OrderSymbol() == Symbol() && OrderType()==OP_SELL && rsi125)
{
OrderClose(OrderTicket(),OrderLots(),Ask,5,Red);
LotS=Lot;
}
}
}
*где rsi1 - это предыдущий rsi, а rsi - текущий.
*LotL & LotS - это множитель первоначального лота, я настроил его на открытие максимум 3 позиций в каждую сторону, поэтому при закрытии одного типа открытых позиций, LotL & LotS будут сброшены до первоначального размера.
советник работает как положено при открытии позиций, но проблема в закрытии открытых позиций, я думаю советник в части цикла не читает все открытые позиции, а только первую... любая помощь в исправлении этого будет очень признательна!!!
ура!
Пит
Я пытаюсь добавить функцию "Пипсы для активации трейлинг-стопа". То, что я изменил, выделено красным цветом. Что еще нужно добавить?
extern string Remark1 = "== Main Settings ==";
extern int MagicNumber = 54321;
extern bool SignalMail = False;
extern bool EachTickMode = true;
extern double Lots = 4;
extern int Slippage = 2;
extern bool UseStopLoss = false;
extern int StopLoss = 100;
extern bool UseTakeProfit = false;
extern int TakeProfit = 15;
extern bool UseTrailingStop = true;
extern int TrailingStop = 45;
extern double Pips_Activate_TS = 5;
extern bool MoveStopOnce = False;
extern int MoveStopWhenPrice = 50;
extern int MoveStopTo = 1;
extern int MaxConcurrentTrades = 2;
//Version 2.01
int BarCount;
int Current;
bool TickCheck = False;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init() {
BarCount = Bars;
if (EachTickMode) Current = 0; else Current = 1;
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit() {
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
int Order = SIGNAL_NONE;
int Total, Ticket;
double StopLossLevel, TakeProfitLevel;
if (EachTickMode && Bars != BarCount) TickCheck = False;
Total = OrdersTotal();
Order = SIGNAL_NONE;
//+------------------------------------------------------------------+
//| Variable Begin |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Variable End |
//+------------------------------------------------------------------+
//Check position
bool IsTrade = False;
for (int i = 0; i < Total; i ++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType() <= OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
IsTrade = True;
if(OrderType() == OP_BUY) {
//Close
//+------------------------------------------------------------------+
//| Signal Begin(Exit Buy) |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Signal End(Exit Buy) |
//+------------------------------------------------------------------+
if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");
if (!EachTickMode) BarCount = Bars;
IsTrade = False;
continue;
}
//MoveOnce
if(MoveStopOnce && MoveStopWhenPrice > 0) {
if(Bid - OrderOpenPrice() >= Point * MoveStopWhenPrice) {
if(OrderStopLoss() < OrderOpenPrice() + Point * MoveStopTo) {
OrderModify(OrderTicket(),OrderOpenPrice(), OrderOpenPrice() + Point * MoveStopTo, OrderTakeProfit(), 0, Red);
if (!EachTickMode) BarCount = Bars;
continue;
}
}
}
//Trailing stop
if(UseTrailingStop && TrailingStop > 0) {
if(Bid - OrderOpenPrice() > Point * TrailingStop) {
if(OrderStopLoss() < Bid - Point * TrailingStop) {
OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);
if (!EachTickMode) BarCount = Bars;
continue;
}
}
}
} else {
//Close
//+------------------------------------------------------------------+
//| Signal End(Exit Sell) |
//+------------------------------------------------------------------+
if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");
if (!EachTickMode) BarCount = Bars;
IsTrade = False;
continue;
}
//MoveOnce
if(MoveStopOnce && MoveStopWhenPrice > 0) {
if(OrderOpenPrice() - Ask >= Point * MoveStopWhenPrice) {
if(OrderStopLoss() > OrderOpenPrice() - Point * MoveStopTo) {
OrderModify(OrderTicket(),OrderOpenPrice(), OrderOpenPrice() - Point * MoveStopTo, OrderTakeProfit(), 0, Red);
if (!EachTickMode) BarCount = Bars;
continue;
}
}
}
//Trailing stop
if(UseTrailingStop && TrailingStop > 0) {
if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {
if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {
OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);
if (!EachTickMode) BarCount = Bars;
continue;
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| Signal Begin(Entry) |
//+------------------------------------------------------------------+
if(Open[0] > Open[0+1] &&
Open[0+1] >= Open[0+2] &&
Open[0+2]>= Open[0+3] &&
Open[0+3] >= Open[0+4] &&
Open[0+4] >= Open[0+5] &&
Open[0+5] >= Open[0+6]) Order = SIGNAL_SELL;
if(Open[0] < Open[0+1] &&
Open[0+1] <= Open[0+2] &&
Open[0+2]<= Open[0+3] &&
Open[0+3] <= Open[0+4] &&
Open[0+4] <= Open[0+5] &&
Open[0+5] <= Open[0+6]) Order = SIGNAL_BUY;
//+------------------------------------------------------------------+
//| Signal End |
//+------------------------------------------------------------------+
//Buy
if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
if(DecideToOpenTrade(OP_BUY) && TradeSlotsAvailable()) {
//Check free margin
if (AccountFreeMargin() < (1000 * Lots)) {
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;
if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;
Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
if(Ticket > 0) {
if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
Print("BUY order opened : ", OrderOpenPrice());
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");
} else {
Print("Error opening BUY order : ", GetLastError());
}
}
if (EachTickMode) TickCheck = True;
if (!EachTickMode) BarCount = Bars;
return(0);
}
}
//Sell
if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
if(DecideToOpenTrade(OP_SELL) && TradeSlotsAvailable()) {
//Check free margin
if (AccountFreeMargin() < (1000 * Lots)) {
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;
if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;
Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
if(Ticket > 0) {
if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
Print("SELL order opened : ", OrderOpenPrice());
if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");
} else {
Print("Error opening SELL order : ", GetLastError());
}
}
if (EachTickMode) TickCheck = True;
if (!EachTickMode) BarCount = Bars;
return(0);
}
}
if (!EachTickMode) BarCount = Bars;
return(0);
}
Здравствуйте, коллеги-трейдеры,
У меня возникла небольшая проблема при разработке эксперта из пользовательского индикатора, я пробовал использовать функцию "iCustom", но мой индикатор всегда возвращает одно и то же значение.
Он возвращает что-то вроде 21473..., примерно так.
Я хочу, чтобы советник мог распознавать, когда генерируются сигналы стрелки на продажу и покупку, и выполнял соответствующее торговое действие (т.е. покупал, когда индикатор говорит вверх, и продавал, когда он говорит вниз).
Вот код индикатора Я был бы очень признателен, если бы кто-нибудь смог найти решение как можно скорее.Пожалуйста, опубликуйте также строки кода с вашей функцией iCustom().
FerruFx
Извините, это все, что у меня есть...
Rsi Ea
Это мой первый советник. Он использует 2 пересечения rsi на 3 таймфреймах. У меня проблема с тем, что советник совершает сделки против пересечения. Покупает, когда должен продавать, продает, когда должен покупать. Не мог бы кто-нибудь взглянуть на код и сказать, где я ошибся. Я не смог увидеть ничего неправильного.
Я прикрепил ea и картинку проблемы.
Нужна помощь для кода советника!
Привет всем,
Как вы знаете, валютный рынок работает 24 часа в сутки, мне не удобно торговать ночью, не сидя за компьютером. Поэтому я думаю, что лучший способ - это программа для защиты сделки, если цена движется в мою пользу. Например, если я открыл 5 лотов в сумме, когда прибыль будет выше 50 пунктов, программа автоматически переместит стоп-лосс в безубыток. Когда прибыль выше 100 пунктов, он перемещается для защиты 30 пунктов. Когда прибыль выше 200 пунктов, он перемещается для защиты 50 пунктов. и так далее.
Я пытался написать свой код. Но он не работает, когда я перетаскиваю его на свой график и устанавливаю его в режиме реального времени. Кто-нибудь может помочь мне взглянуть на мой код и исправить его? Большое спасибо.
#property copyright "x li"
#property link ""
#property show_confirm
//---- входные параметры
extern int target1 =50;
extern int target2 =100;
extern int target3 =150;
extern int target4 =200;
extern int target5 =300;
extern int protect1 =0;
extern int protect2 =5;
extern int protect3 =50;
extern int protect4 =100;
//+-----------------------------------------------------------------------------+
//| скрипт "move stoploss to protect(50->0;100->5;150->50;200->50;300->100)" |
//+-----------------------------------------------------------------------------+
int start()
{
bool result;
double stop_loss,point,EntryPrice,profit;
int cmd,total,error,i;
//----
total=OrdersTotal();
point=MarketInfo(Symbol(),MODE_POINT);
//----
for(i=0; i<total; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
cmd=OrderType();
EntryPrice=OrderOpenPrice();
//---- ордера на покупку рассматриваются
if(cmd==OP_BUY)
{
profit=Bid-EntryPrice;
if(profit>target1*point && profit<target2*point)
{
stop_loss=EntryPrice+protect1*point;
result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
if(profit>target2*point && profit<target3*point)
{
stop_loss=EntryPrice+protect2*point;
result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
if(profit>target3*point && profit<target4*point)
{
stop_loss=EntryPrice+protect3*point;
result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
if(profit>target4*point && profit<target5*point)
{
stop_loss=EntryPrice+protect3*point;
result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
if(profit>target5*point)
{
stop_loss=EntryPrice+protect4*point;
result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
}
//---- ордера на продажу рассматриваются
if(cmd==OP_SELL)
{
profit=EntryPrice-Ask;
if(profit>target1*point && profit<target2*point)
{
stop_loss=EntryPrice-protect1*point;
result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
if(profit>target2*point && profit<target3*point)
{
stop_loss=EntryPrice-protect2*point;
result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
if(profit>target3*point && profit<target4*point)
{
stop_loss=EntryPrice-protect3*point;
result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
if(profit>target4*point && profit<target5*point)
{
stop_loss=EntryPrice-protect3*point;
result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
if(profit>target5*point)
{
stop_loss=EntryPrice-protect4*point;
result=OrderModify(OrderTicket(),0,stop_loss,0,0,CLR_NONE);
}
}
}
else { Print("Ошибка при выборе ордера ", GetLastError()); break; }
}
//----
return(0);
}
//+------------------------------------------------------------------+
Rsi Ea
Я не понимаю, почему вы используете одну и ту же переменную для открытия и закрытия сделок, но это может сработать.
Возможно, проблема в этом:
"Order" - это глобальная переменная. Поэтому в конце каждого запуска функции Start она будет установлена на последнее значение, которое ей было присвоено, и будет использовать это значение для начала следующего запуска. Если вы сделаете ее локальной (переместите ее внутрь Start), это может исправить ситуацию. В противном случае вам придется сбросить его после последнего использования.
Удачной охоты,
Биг Би