Thank you all in advance for any info and reading. My eyes are ready to fall out of my head. Sure could use some help.
Regards Huckleberry
You are missing a } in iTryOpen()
You need a { immediately after iSignalClose()
iTryOpen() is type int so it has to return an int, return(int ); not return();
if (iCommand == OP_BUY) && if (OrderType() == OP_BUY) && if (OrderProfit() > 0) string SELL = "TakeProfit"; is wrong. . . did you mean . . if ( (iCommand == OP_BUY) && (OrderType() == OP_BUY) && (OrderProfit() > 0) ) string SELL = "TakeProfit";
You have a pair of { } in start() that you don't need . .
Hello Raptor UK
Thank you for your prompt attention and knowledge. I will get on this ASAP. And provide feedback.
Regards Huckleberry
And Yes. I did mean
Hey RaptorUK,
Sorry for the incomplete message above. Yes, I did mean to following, with a small edit.
if ((iCommand == OP_SELL) && (OrderType() == OP_SELL))
This message is onlt to just keep you informed. I have done many improvements. There are no errors or warnings. If you can recall, this code is meant to BUY only and liquidate all lots at a given price. The code at this time will BUY, but will not liquidate. I have the internet again and will continue working. Write again later. But here is what I have done so far.
//+------------------------------------------------------------------+ //| Testing (BUY).mq4 | //| Copyright © 2011, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2011, Airat Safin/Ben Banta" #property link "http://www.metaquotes.net" //+------------ Variables -------------- double MaximumRisk = 0.1; double Lots = 0.1; int iBaseLag = 5; int iBaseBar = 1; double dFactorTP = 0.7; double dFactorSL = 1.5; int iGProfit = 44; int iGLoss = 20; int iTradeBarOnce = 1; int iSlippage = 1; int iMagic = 1; int iTradeBarTime = EMPTY; ///+----------------- iSignalOpen() -------------------------- int iSignalOpen () { static double dLowest; dLowest = Low[iLowest(0,0,MODE_LOW,iBaseLag,iBaseBar)]; double dBid; dBid = MarketInfo(Symbol(),MODE_ASK); if (dBid < dLowest) return(OP_BUY); else return(EMPTY); } //+--------------------iTryOpen()----------------------------- int iTryOpen() { int iCommand = iSignalOpen(); if (iCommand == EMPTY) return; if (iCommand == OP_BUY) { string sType = "Buy"; int iColor = Blue; int iMode = MODE_ASK; double dPrice = MarketInfo(Symbol(),iMode); OrderSend(Symbol(),iCommand,LotsOptimized(),NormalizeDouble(dPrice,Digits),iSlippage,0,0,"",iMagic,0,iColor);// ????????? int iTrap = GetLastError(); if (iTrap == 0) { Alert(sType,"Order was a Big Success"); } else { Alert( sType,"open exception ",iTrap); } return(0); } } //+--------------------------iGetTicket()-------------- int iGetTicket() { for(int i = OrdersTotal() -1 ; i >= 0 ; i--) { if (OrderSelect(i, SELECT_BY_POS) == TRUE) if (OrderMagicNumber()== iMagic) return(OrderTicket()); } return(EMPTY); } //+-----------------iSignalClose()----------------- int iSignalClose() { double dProfit; if (OrderType() == OP_SELL) { dProfit = (MarketInfo(Symbol(),MODE_BID)); //To determine the current price if (dProfit >= (iGProfit*Point)+OrderOpenPrice())// If current price is >= to iGProfit plus OrderOpenPrice return(TRUE); } double dLoss; if (OrderType() == OP_SELL) { dLoss = (MarketInfo(Symbol(), MODE_BID)); //To determine the current price if (dLoss <= (iGLoss*Point)-OrderOpenPrice())//If current price is <= minus OrderOpenPrice return(TRUE); } else { return(EMPTY); } } //+------------------------iTryClose()--------------- int iTryClose() { int iCommand = iSignalClose (); if (iCommand == EMPTY) return; if ((iCommand == OP_SELL) && (OrderType() == OP_SELL))// && (OrderProfit() > 0)) { string SELL = "TakeProfit"; } else { SELL = "StopLoss"; } double dPrice = OrderClosePrice(); OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(dPrice,Digits),iSlippage,Blue); int iTrap = GetLastError(); if (iTrap == 0) { Alert(SELL,"Closed Properly"); } else { Alert(SELL,"Close Exception",iTrap); } } //+-------------------------Calculate Position------------- double LotsOptimized() { double lot=Lots; lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/500.0,1); if(lot<0.1) lot=0.1; return(lot); } //+----------------- init()------------ int init() { Alert("","Start",UninitializeReason()); } //+------------------deinit()----------- int deinit() { Alert("","Stop" ,UninitializeReason()); } //+------------------start()-------------- int start() { int iTicket = iGetTicket(); if (iTicket < 0) iTryOpen(); else iTryClose(); } /* //+-------------------GetLastError()-------------------- int iTrap = GetLastError(); if (iTrap == 0) { Alert(iTicket,"All is Well"); } else { Alert(iTicket,"Problems with Ticket",iTrap); } */Best Regards Huckleberry
I think you have a lot of work to do on your code, but keep learning and you will get there . . . for example,
int iSignalClose() // <------- type int . . . . . return(TRUE); // <----- trying to return a bool ? } else { return(EMPTY); } } //+------------------------iTryClose()--------------- int iTryClose() { int iCommand = iSignalClose (); if (iCommand == EMPTY) // from above, this is an int returned as a bool return; if ((iCommand == OP_SELL) && (OrderType() == OP_SELL))// && (OrderProfit() > 0)) // so it can't be OP_SELL, it can only be what was returned by iSignalClose()
Thank you RaptorUK. That helps to clear up bit more. I am plugging in and deleteing out a variety of options. The iGLoss and iGProfit was also changed from an"int" to a "double". The broker that I work with has a 5 digit quote, therefore,
dProfit = (MarketInfo(Symbol(),MODE_BID)); //To determine the current price if (dProfit >= (iGProfit*Point)+OrderOpenPrice())// If current price is >= to iGProfit plus OrderOpenPrice returns OP{SELL) return(OP_SELL);would be correct.....Or would this be better
int iCommand = iSignalClose ();//iCommand equals above function if (iCommand == EMPTY)//if iCommand IS "EMPTY", therefore, it could not be iSignalClose() return; //reurn; is the only response if (iCommand == OP_SELL && (OrderType() == OP_SELL)) //OP_SELL is in the iSignalClose(); return(OP_SELL); And //the OrderType() == OP_SELL; Therefore this "if" line //would be correct..?? I've tried both (iCommand == //OP_SELL and iSignalClose() with no success yet.
There is alao the GetLastError() I am working on. Certainly do not want to screw up a line if it is correct only to find out I should be working on a different function or line which was the problem area. :-) The nose is back to the grind stone.
Cheers
Yes. Currently it is set at 4.4 and 2.0 pips. I built the code originally as a "int' with 4400 and 2000 pips. Much to far for reality. I deleted out the "int" 44 and 20 pips and plugged in "double" 0.00044 and 0.00020. I mentioned this for the public and for you. I did check into the Hyperlink. And added it to my favorites. Thank you.
GetLastError() has a problem.
if (iCommand == OP_SELL && (OrderType() == OP_SELL)) //OP_SELL is in the iSignalClose(); return(OP_SELL); And //the OrderType() == OP_SELL; Therefore the "if" line //would be correct..?? I've tried both (iCommand == //OP_SELL and iSignalClose() with no success yet. { string SELL = "TakeProfit"; } else { SELL = "StopLoss"; } double dPrice = OrderClosePrice(); OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(dPrice,Digits),iSlippage,Blue); int iTrap = GetLastError(); if (iTrap == 0) { Alert(SELL,"Closed Properly ",iTrap); } else { Alert(SELL,"Close Exception",iTrap); } }
Originally, the above GetLastError() code was to Alert () if the trade was 'TakeProfit' else 'StopLoss'. But asking for Alert() 'TakeProfit' or 'StopLoss' will NOT giveing errors. So, to get errors, I have done the following instead. Maybe I am off course, but practice is a learning tool.
//+------------------------iTryClose()--------------- int iTryClose() { int iCommand = iSignalClose ();//iCommand equals above function if (iCommand == EMPTY)//if iCommand IS "EMPTY", therefore, it could not be iSignalClose() return; //return; is the only response if (iCommand == OP_SELL && (OrderType() == OP_SELL)) //OP_SELL is in the iSignalClose(); return(OP_SELL); Since //iCommand() and OrderType() == OP_SELL; Therefore the "if" line //would be correct. double dPrice = OrderClosePrice(); OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(dPrice,Digits),iSlippage,Blue); return; int iTrap = GetLastError(); if(iTrap > 0) //if(!OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(dPrice,Digits),iSlippage,Blue); { Print("error: code #",iTrap); return(0); } }
By doing the above, it still does not liquidate the BUY position, but I believe it gives a better representation to collecting errors that may occur for OrderClose(). Asking for your advise or critic.
Thank you for your time and info.
Cheers
A few points:
You don't need to do this . . .
double dPrice = OrderClosePrice(); OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(dPrice,Digits),iSlippage,Blue);
. . you can do this instead . .
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),iSlippage,Blue);
assuming you have already selected the correct order using OrderSelect( int index, int select, int pool=MODE_TRADES)
In the 2nd version, if you do this . . . .
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(dPrice,Digits),iSlippage,Blue); return; // <------------------------------------------ the function is exited here int iTrap = GetLastError(); // <----- this won't happen
. . maybe you meant this . . .
if ( OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(dPrice,Digits),iSlippage,Blue) ) return;
In the first version: if you aren't getting either Alert then you aren't getting to that part of the code and you need to check your conditional statements that should take you there.

- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Hello to all
I have redone the code so as that it will only BUY. No sell actions except to liquidate the BUY positions. Sounded easy enough. Everything was going well until I got down to the iSignalClose().
The code is attached and if there is anyone who wishes to add or delete for improvement, your welcome to advise constructively.