Function definiton unexpected, Help
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.
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.