//--------------------------------------------------------------------void OPENORDER(string ord)
{
double priceL=m_symbol.Ask();
if(ord=="Sell")
//--- check for free moneyif(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,my_lot,priceL)<0.0)
printf("We have no money. Free Margin = %f",m_account.FreeMargin());
elseif(!m_trade.Sell(my_lot,Symbol(),m_symbol.Bid(),my_SL,my_TP,""))
Print("BUY_STOP -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of Retcode: ",m_trade.ResultRetcodeDescription(),
", ticket of order: ",m_trade.ResultOrder()); // Если sell, то не открываемсяdouble priceS=m_symbol.Bid();
if(ord=="Buy")
//--- check for free moneyif(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_SELL,my_lot,priceS)<0.0)
printf("We have no money. Free Margin = %f",m_account.FreeMargin());
elseif(!m_trade.Buy(my_lot,Symbol(),m_symbol.Ask(),my_SL,my_TP,""))
Print("Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription(),
", ticket of deal: ",m_trade.ResultDeal());
return;
}
double iMAGet(constint handle,constint index)
{
double MA[];
ArraySetAsSeries(MA,true);
//--- reset error codeResetLastError();
//--- fill a part of the iMABuffer array with values from the indicator buffer that has 0 indexif(CopyBuffer(handle,0,0,index+1,MA)<0)
{
//--- if the copying fails, tell the error codePrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());
//--- quit with zero result - it means that the indicator is considered as not calculatedreturn(0.0);
}
return(MA[index]);
}
//+------------------------------------------------------------------+//| Refreshes the symbol quotes data |//+------------------------------------------------------------------+bool RefreshRates()
{
//--- refresh ratesif(!m_symbol.RefreshRates())
return(false);
//--- protection against the return value of "zero"if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
return(false);
//---return(true);
}
//+------------------------------------------------------------------+//| Get Time for specified bar index |//+------------------------------------------------------------------+datetimeiTime(constint index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
{
if(symbol==NULL)
symbol=Symbol();
if(timeframe==0)
timeframe=Period();
datetime Time[];
datetime time=0;
ArraySetAsSeries(Time,true);
int copied=CopyTime(symbol,timeframe,index,1,Time);
if(copied>0)
time=Time[0];
return(time);
}
//+------------------------------------------------------------------+//| Get value of buffers |//+------------------------------------------------------------------+bool iGetArray(constint handle,constint buffer,constint start_pos,
constint count,double &arr_buffer[])
{
bool result=true;
if(!ArrayIsDynamic(arr_buffer))
{
PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
return(false);
}
ArrayFree(arr_buffer);
//--- reset error codeResetLastError();
//--- fill a part of the iBands array with values from the indicator bufferint copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
if(copied!=count)
{
//--- if the copying fails, tell the error codePrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
__FILE__,__FUNCTION__,count,copied,GetLastError());
//--- quit with zero result - it means that the indicator is considered as not calculatedreturn(false);
}
return(result);
}
void TrailingOrder()
{
if(InpTrailingOrderLimit==0)
return;
for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positionsif(m_position.SelectByIndex(i))
if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
{
if(m_position.PositionType()==POSITION_TYPE_BUY)
{
if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTrailingOrderLimit+ExtTrailingOrderStep))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTrailingOrderLimit),
m_position.TakeProfit()))
Print("Modify ",m_position.Ticket());
OPENORDER("Buy");
}
}
else
{
if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTrailingOrderLimit+ExtTrailingOrderStep)
if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTrailingOrderLimit+ExtTrailingOrderStep))) ||
(m_position.StopLoss()==0))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTrailingOrderLimit),
m_position.TakeProfit()))
Print("Modify ",m_position.Ticket());
OPENORDER("Sell");
}
}
}
}
void Trailing()
{
if(InpTStop==0)
return;
if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)
{
if(m_position.PositionType()==POSITION_TYPE_BUY)
{
if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTStop+ExtTStep)
if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTStop+ExtTStep))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTStepShift),
m_position.TakeProfit()))
Print("Modify ",m_position.Ticket(),
" Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
}
}
else
{
if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTStop+ExtTStep)
if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTStop+ExtTStep))) ||
(m_position.StopLoss()==0))
{
if(!m_trade.PositionModify(m_position.Ticket(),
m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTStepShift),
m_position.TakeProfit()))
Print("Modify ",m_position.Ticket(),
" Position -> false. Result Retcode: ",m_trade.ResultRetcode(),
", description of result: ",m_trade.ResultRetcodeDescription());
}
}
}
}
こんにちは。
EAのパラメータにコメントや説明の列を追加することは可能かどうか教えてください。???
ありがとうございます。
はい、でも、ソースが必要です。
ありがとうございました。MQLにそんな機能があったとは。自分でも作ろうと思っていたところでした。でもその前に、フォーラムで聞いて みようと思いました。
こんにちは。
EAのパラメータにコメントや説明の列を追加することは可能かどうか教えてください。???
ありがとうございます。
いつになったらドキュメントを 読めるようになるんだ?
これは、言語の研究に対する間違ったアプローチの結果である。リソースのヘルプを読んで......からのコーディングではなく、ドキュメントを見ながら作業していたらと聞かれることもないでしょう。
私の答えの後には、お説教が待っていると思ったので...。あのね、あなたがするような...と言ったつもりだったのですが。"ありがとうございます "でも、ない...。何か書かないと...。ドキュメントで関数を知っているならば、それは良いことです。でも、コードをちゃんと知らないと、MQLのドキュメントを上下に勉強しても、実践ではほとんど役に立ちません......!
偶然にもこのバグに遭遇
座標がわずかに異なる2つの同じボタンを作成する
次のようになります。
しかし、その結果、OnChartEventに 反応するのは1つ目のボタンだけで、2つ目のボタンは反応しない。
トレーリングの際、Take Profit が500、Stop Loss が150に なるようにしました。
MQL5を知らないのですが、確か
偶然にもこのバグに遭遇
座標がわずかに異なる、2つの同じボタンを作成する
次のようになります。
が、結果的にOnChartEventに 反応するのは1つ目のボタンのみで、2つ目は反応しない。
ハンドラ内のコードを見ることができますか?
また、なぜパラメータに-73があるのか、いまいちよくわからないのですが......?
ハンドラ内のコードを見ることはできますか?
また、パラメータに-73があるのはなぜでしょうか、よく分かりませんが...?
エラーも出ない。
この座標では、ボタンの長さは点Xから+/-で計算されるため、ボタンは上下逆さまになります。